From 1dfd3cd3eb904d898938aba7e9e0ce40355548d1 Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Mon, 2 Dec 2024 17:54:19 +0100 Subject: [PATCH 01/19] ... --- .blueprint | 36 ++- .gitattributes | 1 + .../Owner/Resources/ProductTypeResource.php | 81 ++++++ .../Pages/CreateProductType.php | 12 + .../Pages/EditProductType.php | 19 ++ .../Pages/ListProductTypes.php | 19 ++ .../AttributesRelationManager.php | 239 ++++++++++++++++++ app/Models/ProductType.php | 35 +++ app/Models/ProductTypeAttribute.php | 50 ++++ app/Models/SellerProduct.php | 4 + commands.txt | 2 +- .../factories/ProductTypeAttributeFactory.php | 38 +++ database/factories/ProductTypeFactory.php | 27 ++ database/factories/SellerProductFactory.php | 4 + ...024_12_02_164715_create_sellers_table.php} | 0 ...2_02_164716_create_partnerships_table.php} | 0 ...12_02_164717_create_seller_data_table.php} | 0 ..._12_02_164718_create_categories_table.php} | 0 ...2_164719_create_seller_products_table.php} | 4 + ...20_create_seller_product_images_table.php} | 0 ...2_164721_create_seller_variants_table.php} | 0 ...2024_12_02_164722_create_prices_table.php} | 0 ...2024_12_02_164723_create_stocks_table.php} | 0 ...4_12_02_164724_create_locations_table.php} | 0 ..._12_02_164725_create_currencies_table.php} | 0 ...24_12_02_164726_create_messages_table.php} | 0 ...2_02_164727_create_product_types_table.php | 32 +++ ...8_create_product_type_attributes_table.php | 42 +++ ...12_02_164729_create_seller_user_table.php} | 0 database/seeders/DatabaseSeeder.php | 216 ++++++++++++++++ draft.yaml | 22 +- specs.md | 48 ++++ 32 files changed, 915 insertions(+), 16 deletions(-) create mode 100644 app/Filament/Owner/Resources/ProductTypeResource.php create mode 100644 app/Filament/Owner/Resources/ProductTypeResource/Pages/CreateProductType.php create mode 100644 app/Filament/Owner/Resources/ProductTypeResource/Pages/EditProductType.php create mode 100644 app/Filament/Owner/Resources/ProductTypeResource/Pages/ListProductTypes.php create mode 100644 app/Filament/Owner/Resources/ProductTypeResource/RelationManagers/AttributesRelationManager.php create mode 100644 app/Models/ProductType.php create mode 100644 app/Models/ProductTypeAttribute.php create mode 100644 database/factories/ProductTypeAttributeFactory.php create mode 100644 database/factories/ProductTypeFactory.php rename database/migrations/{2024_11_27_173745_create_sellers_table.php => 2024_12_02_164715_create_sellers_table.php} (100%) rename database/migrations/{2024_11_27_173746_create_partnerships_table.php => 2024_12_02_164716_create_partnerships_table.php} (100%) rename database/migrations/{2024_11_27_173747_create_seller_data_table.php => 2024_12_02_164717_create_seller_data_table.php} (100%) rename database/migrations/{2024_11_27_173748_create_categories_table.php => 2024_12_02_164718_create_categories_table.php} (100%) rename database/migrations/{2024_11_27_173749_create_seller_products_table.php => 2024_12_02_164719_create_seller_products_table.php} (86%) rename database/migrations/{2024_11_27_173750_create_seller_product_images_table.php => 2024_12_02_164720_create_seller_product_images_table.php} (100%) rename database/migrations/{2024_11_27_173751_create_seller_variants_table.php => 2024_12_02_164721_create_seller_variants_table.php} (100%) rename database/migrations/{2024_11_27_173752_create_prices_table.php => 2024_12_02_164722_create_prices_table.php} (100%) rename database/migrations/{2024_11_27_173753_create_stocks_table.php => 2024_12_02_164723_create_stocks_table.php} (100%) rename database/migrations/{2024_11_27_173754_create_locations_table.php => 2024_12_02_164724_create_locations_table.php} (100%) rename database/migrations/{2024_11_27_173755_create_currencies_table.php => 2024_12_02_164725_create_currencies_table.php} (100%) rename database/migrations/{2024_11_27_173756_create_messages_table.php => 2024_12_02_164726_create_messages_table.php} (100%) create mode 100644 database/migrations/2024_12_02_164727_create_product_types_table.php create mode 100644 database/migrations/2024_12_02_164728_create_product_type_attributes_table.php rename database/migrations/{2024_11_27_173757_create_seller_user_table.php => 2024_12_02_164729_create_seller_user_table.php} (100%) create mode 100644 specs.md diff --git a/.blueprint b/.blueprint index 889408a..67e48f6 100644 --- a/.blueprint +++ b/.blueprint @@ -11,19 +11,23 @@ created: - database/factories/LocationFactory.php - database/factories/CurrencyFactory.php - database/factories/MessageFactory.php - - database/migrations/2024_11_27_173745_create_sellers_table.php - - database/migrations/2024_11_27_173746_create_partnerships_table.php - - database/migrations/2024_11_27_173747_create_seller_data_table.php - - database/migrations/2024_11_27_173748_create_categories_table.php - - database/migrations/2024_11_27_173749_create_seller_products_table.php - - database/migrations/2024_11_27_173750_create_seller_product_images_table.php - - database/migrations/2024_11_27_173751_create_seller_variants_table.php - - database/migrations/2024_11_27_173752_create_prices_table.php - - database/migrations/2024_11_27_173753_create_stocks_table.php - - database/migrations/2024_11_27_173754_create_locations_table.php - - database/migrations/2024_11_27_173755_create_currencies_table.php - - database/migrations/2024_11_27_173756_create_messages_table.php - - database/migrations/2024_11_27_173757_create_seller_user_table.php + - database/factories/ProductTypeFactory.php + - database/factories/ProductTypeAttributeFactory.php + - database/migrations/2024_12_02_164715_create_sellers_table.php + - database/migrations/2024_12_02_164716_create_partnerships_table.php + - database/migrations/2024_12_02_164717_create_seller_data_table.php + - database/migrations/2024_12_02_164718_create_categories_table.php + - database/migrations/2024_12_02_164719_create_seller_products_table.php + - database/migrations/2024_12_02_164720_create_seller_product_images_table.php + - database/migrations/2024_12_02_164721_create_seller_variants_table.php + - database/migrations/2024_12_02_164722_create_prices_table.php + - database/migrations/2024_12_02_164723_create_stocks_table.php + - database/migrations/2024_12_02_164724_create_locations_table.php + - database/migrations/2024_12_02_164725_create_currencies_table.php + - database/migrations/2024_12_02_164726_create_messages_table.php + - database/migrations/2024_12_02_164727_create_product_types_table.php + - database/migrations/2024_12_02_164728_create_product_type_attributes_table.php + - database/migrations/2024_12_02_164729_create_seller_user_table.php - app/Models/Seller.php - app/Models/Partnership.php - app/Models/SellerData.php @@ -36,13 +40,15 @@ created: - app/Models/Location.php - app/Models/Currency.php - app/Models/Message.php + - app/Models/ProductType.php + - app/Models/ProductTypeAttribute.php models: User: { name: string, email: string, is_seller: "boolean default:'0'", email_verified_at: 'datetime nullable', password: string, remember_token: 'string nullable' } Seller: { name: string, hideProducts: 'boolean default:false', relationships: { belongsToMany: User, hasOne: 'SellerData, Partnership', hasMany: 'SellerProduct, SellerVariant, Price, Stock, Location, Message' } } Partnership: { seller_id: 'id foreign', status: 'enum:submitted,accepted,rejected,review default:submitted', rejection_reason: 'text nullable', notes: 'text nullable', select_all_products: 'boolean default:false' } SellerData: { seller_id: 'id foreign', email: 'string nullable', description: 'text nullable', company_name: 'string nullable', address_line1: 'string nullable', address_line2: 'string nullable', city: 'string nullable', state: 'string nullable', postal_code: 'string nullable', country_code: 'string nullable', phone: 'string nullable', vat: 'string nullable', tin: 'string nullable', eori: 'string nullable', iban: 'string nullable', swift_bic: 'string nullable', bank_name: 'string nullable', account_holder_name: 'string nullable', file1: 'string nullable', file2: 'string nullable', file3: 'string nullable' } Category: { name: string, description: 'text nullable', is_active: 'boolean nullable', parent_id: 'id foreign:categories.id nullable', relationships: { hasMany: SellerProduct } } - SellerProduct: { name: string, brand: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', category_id: 'id foreign nullable', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', selected: 'boolean default:false', relationships: { hasMany: 'SellerVariant,Price,Stock,SellerProductImage:image' } } + SellerProduct: { name: string, brand: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', category_id: 'id foreign nullable', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', selected: 'boolean default:false', ean: 'string nullable', upc: 'string nullable', gtin_14: 'string nullable', gtin_8: 'string nullable', relationships: { hasMany: 'SellerVariant,Price,Stock,SellerProductImage:image' } } SellerProductImage: { seller_product_id: 'id foreign', seller_variant_id: 'id foreign nullable', image: string, number: 'integer default:1' } SellerVariant: { name: string, sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', seller_product_id: 'id foreign', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', relationships: { hasMany: 'Price, Stock, SellerProductImage:image' } } Price: { amount: integer, seller_variant_id: 'id foreign nullable', seller_product_id: 'id foreign', currency_id: 'id foreign' } @@ -50,3 +56,5 @@ models: Location: { name: string, address: string, default_delivery_days: 'integer nullable', seller_id: 'id foreign', relationships: { hasMany: Stock } } Currency: { code: string, symbol: string, name: 'string nullable', is_default: 'boolean default:false', relationships: { hasMany: Price } } Message: { content: text, seller_id: 'id foreign', message_id: 'id foreign nullable' } + ProductType: { name: string, relationships: { hasMany: 'ProductTypeAttribute:attribute' } } + ProductTypeAttribute: { name: string, type: 'enum:text,boolean,number,select,url,color', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', options: 'json nullable', validators: 'json nullable', product_type_id: 'id foreign' } diff --git a/.gitattributes b/.gitattributes index fcb21d3..2c0ec3f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9,3 +9,4 @@ /.github export-ignore CHANGELOG.md export-ignore .styleci.yml export-ignore +specs.md \ No newline at end of file diff --git a/app/Filament/Owner/Resources/ProductTypeResource.php b/app/Filament/Owner/Resources/ProductTypeResource.php new file mode 100644 index 0000000..d39ca1a --- /dev/null +++ b/app/Filament/Owner/Resources/ProductTypeResource.php @@ -0,0 +1,81 @@ +schema([ + Forms\Components\Section::make('Product Type Details') + ->schema([ + Forms\Components\TextInput::make('name') + ->required(), + + ]), + + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('name') + ->searchable(), + Tables\Columns\TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->actions([ + Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getRelations(): array + { + return [ + RelationManagers\AttributesRelationManager::class, + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListProductTypes::route('/'), + 'create' => Pages\CreateProductType::route('/create'), + 'edit' => Pages\EditProductType::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Owner/Resources/ProductTypeResource/Pages/CreateProductType.php b/app/Filament/Owner/Resources/ProductTypeResource/Pages/CreateProductType.php new file mode 100644 index 0000000..410434f --- /dev/null +++ b/app/Filament/Owner/Resources/ProductTypeResource/Pages/CreateProductType.php @@ -0,0 +1,12 @@ +schema([ + Forms\Components\Section::make('Basic Attribute Information') + ->schema([ + Forms\Components\TextInput::make('name') + ->required() + ->maxLength(255) + ->label('Attribute Name') + ->placeholder('e.g., Color, Size, Material') + ->helperText('Enter a unique, descriptive name for this attribute.'), + + Forms\Components\Toggle::make('is_variant_attribute') + ->label('Is Variant Attribute') + ->helperText('Enable this if this attribute differs between product variants'), + + Forms\Components\Textarea::make('description') + ->maxLength(255) + ->columnSpan(2) + ->helperText('Detailed description for attribute mapping for internal use. More context improves mapping precision.'), + ]) + ->columns(2), + + Forms\Components\Section::make('Attribute Configuration') + ->schema([ + Forms\Components\Select::make('type') + ->native(false) + ->options([ + 'text' => 'Text', + 'boolean' => 'Boolean', + 'number' => 'Number', + 'select' => 'Select', + 'url' => 'URL', + 'color' => 'Color', + ]) + ->required() + ->live() + ->afterStateUpdated(function (Forms\Set $set, ?string $state) { + // Always reset the field when type changes + $set('field', null); + + // Set field automatically only for single-option types + $singleOptionTypes = [ + 'number' => 'TextInput', + 'select' => 'Select', + 'url' => 'TextInput', + 'color' => 'ColorPicker', + ]; + + if (isset($singleOptionTypes[$state])) { + $set('field', $singleOptionTypes[$state]); + } + }) + ->helperText('Select the data type for this attribute. This determines how the attribute will be displayed and validated.'), + + Forms\Components\Select::make('field') + ->native(false) + ->options(function (Forms\Get $get) { + return match ($get('type')) { + 'text' => [ + 'TextInput' => 'Text Input', + 'Textarea' => 'Textarea', + 'RichEditor' => 'Rich Editor', + 'MarkdownEditor' => 'Markdown Editor', + ], + 'boolean' => [ + 'Checkbox' => 'Checkbox', + 'Toggle' => 'Toggle', + ], + 'number' => [ + 'TextInput' => 'Text Input', + ], + 'select' => [ + 'Select' => 'Single Select', + 'MultiSelect' => 'Mutli Select', + 'CheckboxList' => 'Checkbox List', + 'Radio' => 'Radio buttons', + 'TagsInput' => 'Tags', + ], + 'url' => [ + 'TextInput' => 'Text Input', + ], + 'color' => [ + 'ColorPicker' => 'Color Picker', + ], + default => [], + }; + }) + ->required() + ->disabled(fn(Forms\Get $get) => blank($get('type'))) + ->helperText('Choose how this attribute will be displayed in forms'), + + Forms\Components\Repeater::make('options') + ->label('Options') + ->schema([ + Forms\Components\Grid::make(2) + ->schema([ + Forms\Components\TextInput::make('label') + ->required(), + Forms\Components\TextInput::make('value') + ->required(), + ]), + ]) + ->collapsible() + ->collapsed() + ->itemLabel(fn(array $state): ?string => $state['label'] ?? null) + ->defaultItems(0) + ->visible(fn(Forms\Get $get): bool => $get('field') === 'Select' || $get('field') === 'ColorPicker') + ->columnSpanFull(), + + Forms\Components\TextInput::make('unit') + ->maxLength(255) + ->label('Unit of Measurement') + ->placeholder('e.g., cm, kg, liters') + ->helperText('Optional. Specify the unit of measurement for this attribute, if applicable.') + ->nullable() + ->visible(fn(Forms\Get $get): bool => in_array($get('type'), [ + 'text', + 'number', + 'select', + ])), + ]) + ->columns(2), + + Forms\Components\Section::make('Validation Rules') + ->schema([ + Forms\Components\Toggle::make('required') + ->label('Required Field') + ->helperText('Make this attribute mandatory when creating or editing products'), + + Forms\Components\TextInput::make('validators.min_length') + ->label('Minimum Length') + ->helperText('Minimum number of characters required') + ->numeric() + ->visible(fn(Forms\Get $get): bool => $get('type') === 'text'), + + Forms\Components\TextInput::make('validators.max_length') + ->label('Maximum Length') + ->helperText('Maximum number of characters allowed') + ->numeric() + ->visible(fn(Forms\Get $get): bool => $get('type') === 'text'), + + Forms\Components\TextInput::make('validators.regex') + ->label('Regular Expression Pattern') + ->helperText('Custom pattern for validation') + ->visible(fn(Forms\Get $get): bool => $get('type') === 'text'), + + + Forms\Components\TextInput::make('validators.decimal_places') + ->label('Decimal Places') + ->helperText('Number of decimal places allowed') + ->numeric() + ->visible(fn(Forms\Get $get): bool => $get('type') === 'number'), + + Forms\Components\TextInput::make('validators.min') + ->label('Minimum Value') + ->helperText('Smallest number allowed') + ->numeric() + ->visible(fn(Forms\Get $get): bool => $get('type') === 'number'), + + Forms\Components\TextInput::make('validators.max') + ->label('Maximum Value') + ->helperText('Largest number allowed') + ->numeric() + ->visible(fn(Forms\Get $get): bool => $get('type') === 'number'), + + Forms\Components\Toggle::make('validators.active_url') + ->label('Validate Active URL') + ->helperText('Check if the URL is actually reachable') + ->visible(fn(Forms\Get $get): bool => $get('type') === 'url'), + + Forms\Components\TextInput::make('validators.starts_with') + ->label('URL Must Start With') + ->helperText('Required URL prefix (e.g., https://)') + ->visible(fn(Forms\Get $get): bool => $get('type') === 'url'), + ]) + ->columns(2) + ->collapsible(), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('name') + ->columns([ + Tables\Columns\TextColumn::make('name') + ->searchable() + ->sortable(), + Tables\Columns\IconColumn::make('required') + ->boolean() + ->sortable(), + Tables\Columns\TextColumn::make('type') + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('field') + ->searchable() + ->sortable(), + Tables\Columns\IconColumn::make('is_variant_attribute') + ->boolean() + ->sortable(), + ]) + ->defaultSort('rank') + ->filters([ + // + ]) + ->headerActions([ + Tables\Actions\CreateAction::make() + ->slideOver(), + ]) + ->actions([ + Tables\Actions\EditAction::make() + ->slideOver(), + Tables\Actions\DeleteAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Models/ProductType.php b/app/Models/ProductType.php new file mode 100644 index 0000000..55acbeb --- /dev/null +++ b/app/Models/ProductType.php @@ -0,0 +1,35 @@ + 'integer', + ]; + + public function attributes(): HasMany + { + return $this->hasMany(ProductTypeAttribute::class); + } +} diff --git a/app/Models/ProductTypeAttribute.php b/app/Models/ProductTypeAttribute.php new file mode 100644 index 0000000..d6080fa --- /dev/null +++ b/app/Models/ProductTypeAttribute.php @@ -0,0 +1,50 @@ + 'integer', + 'required' => 'boolean', + 'is_variant_attribute' => 'boolean', + 'options' => 'array', + 'validators' => 'array', + 'product_type_id' => 'integer', + ]; + + public function productType(): BelongsTo + { + return $this->belongsTo(ProductType::class); + } +} diff --git a/app/Models/SellerProduct.php b/app/Models/SellerProduct.php index b9ac8aa..eca7cf4 100644 --- a/app/Models/SellerProduct.php +++ b/app/Models/SellerProduct.php @@ -26,6 +26,10 @@ class SellerProduct extends Model 'seller_id', 'status', 'selected', + 'ean', + 'upc', + 'gtin_14', + 'gtin_8', ]; /** diff --git a/commands.txt b/commands.txt index bebbfaf..ba2b7fd 100644 --- a/commands.txt +++ b/commands.txt @@ -5,7 +5,7 @@ php artisan blueprint:trace && php artisan blueprint:build && php artisan migra -php artisan make:filament-resource Currency --generate +php artisan make:filament-resource Currency --generate --panel=owner php artisan make:filament-resource Category --generate php artisan make:filament-resource SellerProduct --generate diff --git a/database/factories/ProductTypeAttributeFactory.php b/database/factories/ProductTypeAttributeFactory.php new file mode 100644 index 0000000..07db76a --- /dev/null +++ b/database/factories/ProductTypeAttributeFactory.php @@ -0,0 +1,38 @@ + $this->faker->name(), + 'type' => $this->faker->randomElement(["text","boolean","number","select","url","color"]), + 'field' => $this->faker->randomElement(["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]), + 'required' => $this->faker->boolean(), + 'rank' => $this->faker->numberBetween(-10000, 10000), + 'description' => $this->faker->text(), + 'unit' => $this->faker->word(), + 'is_variant_attribute' => $this->faker->boolean(), + 'options' => '{}', + 'validators' => '{}', + 'product_type_id' => ProductType::factory(), + ]; + } +} diff --git a/database/factories/ProductTypeFactory.php b/database/factories/ProductTypeFactory.php new file mode 100644 index 0000000..a880da5 --- /dev/null +++ b/database/factories/ProductTypeFactory.php @@ -0,0 +1,27 @@ + $this->faker->name(), + ]; + } +} diff --git a/database/factories/SellerProductFactory.php b/database/factories/SellerProductFactory.php index 65714b0..3609f56 100644 --- a/database/factories/SellerProductFactory.php +++ b/database/factories/SellerProductFactory.php @@ -32,6 +32,10 @@ public function definition(): array 'seller_id' => Seller::factory(), 'status' => $this->faker->randomElement(["draft","active","delisted"]), 'selected' => $this->faker->boolean(), + 'ean' => $this->faker->word(), + 'upc' => $this->faker->word(), + 'gtin_14' => $this->faker->word(), + 'gtin_8' => $this->faker->word(), ]; } } diff --git a/database/migrations/2024_11_27_173745_create_sellers_table.php b/database/migrations/2024_12_02_164715_create_sellers_table.php similarity index 100% rename from database/migrations/2024_11_27_173745_create_sellers_table.php rename to database/migrations/2024_12_02_164715_create_sellers_table.php diff --git a/database/migrations/2024_11_27_173746_create_partnerships_table.php b/database/migrations/2024_12_02_164716_create_partnerships_table.php similarity index 100% rename from database/migrations/2024_11_27_173746_create_partnerships_table.php rename to database/migrations/2024_12_02_164716_create_partnerships_table.php diff --git a/database/migrations/2024_11_27_173747_create_seller_data_table.php b/database/migrations/2024_12_02_164717_create_seller_data_table.php similarity index 100% rename from database/migrations/2024_11_27_173747_create_seller_data_table.php rename to database/migrations/2024_12_02_164717_create_seller_data_table.php diff --git a/database/migrations/2024_11_27_173748_create_categories_table.php b/database/migrations/2024_12_02_164718_create_categories_table.php similarity index 100% rename from database/migrations/2024_11_27_173748_create_categories_table.php rename to database/migrations/2024_12_02_164718_create_categories_table.php diff --git a/database/migrations/2024_11_27_173749_create_seller_products_table.php b/database/migrations/2024_12_02_164719_create_seller_products_table.php similarity index 86% rename from database/migrations/2024_11_27_173749_create_seller_products_table.php rename to database/migrations/2024_12_02_164719_create_seller_products_table.php index c268c40..1ddc912 100644 --- a/database/migrations/2024_11_27_173749_create_seller_products_table.php +++ b/database/migrations/2024_12_02_164719_create_seller_products_table.php @@ -24,6 +24,10 @@ public function up(): void $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); $table->enum('status', ["draft","active","delisted"])->default('draft'); $table->boolean('selected')->default(false); + $table->string('ean')->nullable(); + $table->string('upc')->nullable(); + $table->string('gtin_14')->nullable(); + $table->string('gtin_8')->nullable(); $table->timestamps(); }); diff --git a/database/migrations/2024_11_27_173750_create_seller_product_images_table.php b/database/migrations/2024_12_02_164720_create_seller_product_images_table.php similarity index 100% rename from database/migrations/2024_11_27_173750_create_seller_product_images_table.php rename to database/migrations/2024_12_02_164720_create_seller_product_images_table.php diff --git a/database/migrations/2024_11_27_173751_create_seller_variants_table.php b/database/migrations/2024_12_02_164721_create_seller_variants_table.php similarity index 100% rename from database/migrations/2024_11_27_173751_create_seller_variants_table.php rename to database/migrations/2024_12_02_164721_create_seller_variants_table.php diff --git a/database/migrations/2024_11_27_173752_create_prices_table.php b/database/migrations/2024_12_02_164722_create_prices_table.php similarity index 100% rename from database/migrations/2024_11_27_173752_create_prices_table.php rename to database/migrations/2024_12_02_164722_create_prices_table.php diff --git a/database/migrations/2024_11_27_173753_create_stocks_table.php b/database/migrations/2024_12_02_164723_create_stocks_table.php similarity index 100% rename from database/migrations/2024_11_27_173753_create_stocks_table.php rename to database/migrations/2024_12_02_164723_create_stocks_table.php diff --git a/database/migrations/2024_11_27_173754_create_locations_table.php b/database/migrations/2024_12_02_164724_create_locations_table.php similarity index 100% rename from database/migrations/2024_11_27_173754_create_locations_table.php rename to database/migrations/2024_12_02_164724_create_locations_table.php diff --git a/database/migrations/2024_11_27_173755_create_currencies_table.php b/database/migrations/2024_12_02_164725_create_currencies_table.php similarity index 100% rename from database/migrations/2024_11_27_173755_create_currencies_table.php rename to database/migrations/2024_12_02_164725_create_currencies_table.php diff --git a/database/migrations/2024_11_27_173756_create_messages_table.php b/database/migrations/2024_12_02_164726_create_messages_table.php similarity index 100% rename from database/migrations/2024_11_27_173756_create_messages_table.php rename to database/migrations/2024_12_02_164726_create_messages_table.php diff --git a/database/migrations/2024_12_02_164727_create_product_types_table.php b/database/migrations/2024_12_02_164727_create_product_types_table.php new file mode 100644 index 0000000..fdf1c25 --- /dev/null +++ b/database/migrations/2024_12_02_164727_create_product_types_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_types'); + } +}; diff --git a/database/migrations/2024_12_02_164728_create_product_type_attributes_table.php b/database/migrations/2024_12_02_164728_create_product_type_attributes_table.php new file mode 100644 index 0000000..8c8f77d --- /dev/null +++ b/database/migrations/2024_12_02_164728_create_product_type_attributes_table.php @@ -0,0 +1,42 @@ +id(); + $table->string('name'); + $table->enum('type', ["text","boolean","number","select","url","color"]); + $table->enum('field', ["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]); + $table->boolean('required')->default(false); + $table->integer('rank')->default(0); + $table->string('description')->nullable(); + $table->string('unit')->nullable(); + $table->boolean('is_variant_attribute')->default(false); + $table->json('options')->nullable(); + $table->json('validators')->nullable(); + $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_type_attributes'); + } +}; diff --git a/database/migrations/2024_11_27_173757_create_seller_user_table.php b/database/migrations/2024_12_02_164729_create_seller_user_table.php similarity index 100% rename from database/migrations/2024_11_27_173757_create_seller_user_table.php rename to database/migrations/2024_12_02_164729_create_seller_user_table.php diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 7ac93f8..548a6c4 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -13,6 +13,7 @@ use App\Models\Price; use App\Models\Operator; use App\Models\Partnership; +use App\Models\ProductType; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder @@ -749,6 +750,221 @@ public function run(): void Currency::create($currency); } + $productTypes = [ + [ + 'name' => 'T-Shirt', + 'attributes' => [ + [ + 'name' => 'Size', + 'type' => 'select', + 'field' => 'Select', + 'description' => 'Standard t-shirt size using international sizing system (XS to XL)', + 'is_variant_attribute' => true, + 'rank' => 1, + 'options' => [ + ['label' => 'Extra Small', 'value' => 'XS'], + ['label' => 'Small', 'value' => 'S'], + ['label' => 'Medium', 'value' => 'M'], + ['label' => 'Large', 'value' => 'L'], + ['label' => 'Extra Large', 'value' => 'XL'], + ], + ], + [ + 'name' => 'Color', + 'type' => 'select', + 'field' => 'ColorPicker', + 'description' => 'Main color of the t-shirt. For multi-colored shirts, choose the dominant color', + 'is_variant_attribute' => true, + 'rank' => 2, + ], + [ + 'name' => 'Material', + 'type' => 'text', + 'field' => 'TextInput', + 'description' => 'Fabric composition (e.g., "100% Cotton" or "95% Cotton, 5% Elastane")', + 'is_variant_attribute' => false, + 'rank' => 3, + 'unit' => '%', + 'validators' => [ + 'max_length' => 100, + ], + ], + ], + ], + [ + 'name' => 'Jeans', + 'attributes' => [ + [ + 'name' => 'Waist Size', + 'type' => 'number', + 'field' => 'TextInput', + 'description' => 'Waist measurement in inches. Measure around the natural waistline', + 'is_variant_attribute' => true, + 'rank' => 1, + 'unit' => 'inch', + 'validators' => [ + 'min' => 24, + 'max' => 48, + ], + ], + [ + 'name' => 'Length', + 'type' => 'number', + 'field' => 'TextInput', + 'description' => 'Inseam length in inches, measured from crotch to hem', + 'is_variant_attribute' => true, + 'rank' => 2, + 'unit' => 'inch', + 'validators' => [ + 'min' => 26, + 'max' => 36, + ], + ], + [ + 'name' => 'Style', + 'type' => 'select', + 'field' => 'Select', + 'description' => 'Cut and fit style of the jeans, affecting how they shape to the body', + 'is_variant_attribute' => true, + 'rank' => 3, + 'options' => [ + ['label' => 'Skinny', 'value' => 'skinny'], + ['label' => 'Slim', 'value' => 'slim'], + ['label' => 'Regular', 'value' => 'regular'], + ['label' => 'Relaxed', 'value' => 'relaxed'], + ['label' => 'Boot Cut', 'value' => 'boot_cut'], + ], + ], + ], + ], + [ + 'name' => 'Dress', + 'attributes' => [ + [ + 'name' => 'Size', + 'type' => 'select', + 'field' => 'Select', + 'description' => 'Standard dress size using international sizing system (XS to XL)', + 'is_variant_attribute' => true, + 'rank' => 1, + 'options' => [ + ['label' => 'Extra Small', 'value' => 'XS'], + ['label' => 'Small', 'value' => 'S'], + ['label' => 'Medium', 'value' => 'M'], + ['label' => 'Large', 'value' => 'L'], + ['label' => 'Extra Large', 'value' => 'XL'], + ], + ], + [ + 'name' => 'Length', + 'description' => 'Length of the dress', + 'type' => 'select', + 'field' => 'Select', + 'description' => 'Overall length of the dress, measured from shoulder to hem', + 'is_variant_attribute' => false, + 'rank' => 2, + 'options' => [ + ['label' => 'Mini', 'value' => 'mini'], + ['label' => 'Knee Length', 'value' => 'knee'], + ['label' => 'Midi', 'value' => 'midi'], + ['label' => 'Maxi', 'value' => 'maxi'], + ], + ], + ], + ], + [ + 'name' => 'Shoes', + 'attributes' => [ + [ + 'name' => 'Size', + 'type' => 'number', + 'field' => 'TextInput', + 'description' => 'European shoe size. For half sizes, round up to the nearest whole number', + 'is_variant_attribute' => true, + 'rank' => 1, + 'unit' => 'EU', + 'validators' => [ + 'min' => 35, + 'max' => 47, + 'decimal_places' => 0, + ], + ], + [ + 'name' => 'Color', + 'type' => 'select', + 'field' => 'ColorPicker', + 'description' => 'Primary color of the shoes. For multi-colored shoes, select the dominant color', + 'is_variant_attribute' => true, + 'rank' => 2, + ], + [ + 'name' => 'Material', + 'type' => 'select', + 'field' => 'Select', + 'description' => 'Primary material used in the shoe construction', + 'is_variant_attribute' => false, + 'rank' => 3, + 'options' => [ + ['label' => 'Leather', 'value' => 'leather'], + ['label' => 'Suede', 'value' => 'suede'], + ['label' => 'Canvas', 'value' => 'canvas'], + ['label' => 'Synthetic', 'value' => 'synthetic'], + ], + ], + ], + ], + [ + 'name' => 'Bag', + 'attributes' => [ + [ + 'name' => 'Size', + 'type' => 'select', + 'field' => 'Select', + 'description' => 'General size category of the bag, based on carrying capacity and dimensions', + 'is_variant_attribute' => false, + 'rank' => 1, + 'options' => [ + ['label' => 'Small', 'value' => 'small'], + ['label' => 'Medium', 'value' => 'medium'], + ['label' => 'Large', 'value' => 'large'], + ], + ], + [ + 'name' => 'Color', + 'type' => 'select', + 'field' => 'ColorPicker', + 'description' => 'Main color of the bag. For multi-colored bags, choose the predominant color', + 'is_variant_attribute' => true, + 'rank' => 2, + ], + [ + 'name' => 'Material', + 'type' => 'select', + 'field' => 'Select', + 'description' => 'Primary material used in the bag construction. Affects durability and care instructions', + 'is_variant_attribute' => false, + 'rank' => 3, + 'options' => [ + ['label' => 'Leather', 'value' => 'leather'], + ['label' => 'Canvas', 'value' => 'canvas'], + ['label' => 'Nylon', 'value' => 'nylon'], + ['label' => 'Synthetic', 'value' => 'synthetic'], + ], + ], + ], + ], + ]; + + foreach ($productTypes as $productTypeData) { + $attributes = $productTypeData['attributes']; + unset($productTypeData['attributes']); + + $productType = \App\Models\ProductType::create($productTypeData); + + foreach ($attributes as $attributeData) { + $productType->attributes()->create($attributeData); + } + } // Get all variants and currencies $variants = SellerVariant::all(); diff --git a/draft.yaml b/draft.yaml index 2a844c7..590a3bb 100644 --- a/draft.yaml +++ b/draft.yaml @@ -45,7 +45,6 @@ models: parent_id: id foreign:categories.id nullable relationships: hasMany: SellerProduct - SellerProduct: name: string brand: string nullable @@ -56,6 +55,10 @@ models: seller_id: id foreign status: enum:draft,active,delisted default:draft selected: boolean default:false + ean: string nullable + upc: string nullable + gtin_14: string nullable + gtin_8: string nullable relationships: hasMany: SellerVariant,Price,Stock,SellerProductImage:image @@ -113,6 +116,23 @@ models: seller_id: id foreign message_id: id foreign nullable + ProductType: + name: string + relationships: + hasMany: ProductTypeAttribute:attribute + + ProductTypeAttribute: + name: string + type: enum:text,boolean,number,select,url,color + field: enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker + required: boolean default:false + rank: integer default:0 + description: string nullable + unit: string nullable + is_variant_attribute: boolean default:false + options: json nullable + validators: json nullable + product_type_id: id foreign controllers: # ... diff --git a/specs.md b/specs.md new file mode 100644 index 0000000..862e889 --- /dev/null +++ b/specs.md @@ -0,0 +1,48 @@ + +# Owner - Product Types & Attributes +- [x] As an owner, I can CRUD product types. Each product type includes a name (e.g., "Book"). +- [x] As an owner, I can define product attributes per product types. Each attribute has a name (e.g., "material"), a type, a form field, a set of validators and options (for selects). + + +| Attribute Type | Compatible FilamentPHP Form Field Types | +|----------------|-----------------------------------------------------| +| **Text** | `TextInput`, `Textarea` | +| **Boolean** | `Checkbox`, `Toggle` | +| **Number** | `TextInput` (with number validation) | +| **Select** | `Select` | +| **URL** | `TextInput` (with URL validation) | +| **Color** | `ColorPicker` | + +Field type and Validators: + +| Form Field | Validators Mentioned in Docs | +|-------------------|----------------------------------------------------------| +| **TextInput** | Required, Email, URL, Min (character length), Max (character length), Regex, String | +| **Textarea** | Required, Min (character length), Max (character length), String |ls +| **Checkbox** | Required, Boolean | +| **Toggle** | Required, Boolean | +| **Select** | Required, Enum, In (specific values), NotIn (excluded values) | +| **ColorPicker** | Required, Hexadecimal Color Code | +| **Repeater** | Array, Min (items), Max (items), Required | +| **CheckboxList** | Array, Required | +| **KeyValue** | Array (with key-value format validation), Required | + +## Product Type Mapping +When a seller sets a seller-product to "active", then: +- [ ] ... a golden product is created or selected (if EAN or other non-merchant specific article number matches). +- [ ] ... the product-type is determined via AI +- [ ] ... the attributes (of the seller) are mapped to the attributes of the selected product-type via AI. Attributes may be split or merged during this step (e.g. dimensions). Attributes, that cannot be mapped, will be saved to an unmapped attributes field in the golden record +- [ ] ... all textual content is translated into the owner's configured locales +- [ ] ... prices and stocks are copied to the golden product and marked with the seller's ID (existing entities must get the prefix Seller*) +- [ ] ... images are copied to the golden product (with seller ID). AI chooses one set of products and marks it, so the shop can use it. +- [ ] If there is already a golden record that is related to a seller-product then .... +- [ ] - [ ] If there is already a golden record that is not yet related to a seller-product, but has the same EAN then .... + +# Owner - Golden Products +- [ ] As an Owner, I can see a list of all Golden Products, with badge for "new" and "updated". I can also see the number of related seller-products (from different sellers that sell the same product) +- [ ] As an owner, I can see golden product form based on the defined product types and their attributes in all configured languages, side-by-side with the seller's data. +- [ ] As an owner, I can change any data of the golden record. +- [ ] As an owner, I can choose which image set is used for my shop. +- [ ] As an owner, I can set a status on the golden product, so it's published to my shop. +- [ ] TODO status + From 5dc1ae8db870d556edba9ee06978b16f45b0500a Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Mon, 2 Dec 2024 19:26:48 +0100 Subject: [PATCH 02/19] ... --- .blueprint | 36 ++-- .../Owner/Resources/GoldenProductResource.php | 190 ++++++++++++++++++ .../Pages/CreateGoldenProduct.php | 12 ++ .../Pages/EditGoldenProduct.php | 19 ++ .../Pages/ListGoldenProducts.php | 19 ++ .../Owner/Resources/ProductTypeResource.php | 8 +- app/Models/GoldenProduct.php | 40 ++++ app/Models/ProductType.php | 5 + database/factories/GoldenProductFactory.php | 31 +++ ...024_12_02_181739_create_sellers_table.php} | 0 ...2_02_181740_create_partnerships_table.php} | 0 ...12_02_181741_create_seller_data_table.php} | 0 ..._12_02_181742_create_categories_table.php} | 0 ...2_181743_create_seller_products_table.php} | 0 ...44_create_seller_product_images_table.php} | 0 ...2_181745_create_seller_variants_table.php} | 0 ...2024_12_02_181746_create_prices_table.php} | 0 ...2024_12_02_181747_create_stocks_table.php} | 0 ...4_12_02_181748_create_locations_table.php} | 0 ..._12_02_181749_create_currencies_table.php} | 0 ...24_12_02_181750_create_messages_table.php} | 0 ..._02_181751_create_product_types_table.php} | 0 ..._create_product_type_attributes_table.php} | 0 ...02_181753_create_golden_products_table.php | 35 ++++ ...12_02_181754_create_seller_user_table.php} | 0 draft.yaml | 8 +- 26 files changed, 384 insertions(+), 19 deletions(-) create mode 100644 app/Filament/Owner/Resources/GoldenProductResource.php create mode 100644 app/Filament/Owner/Resources/GoldenProductResource/Pages/CreateGoldenProduct.php create mode 100644 app/Filament/Owner/Resources/GoldenProductResource/Pages/EditGoldenProduct.php create mode 100644 app/Filament/Owner/Resources/GoldenProductResource/Pages/ListGoldenProducts.php create mode 100644 app/Models/GoldenProduct.php create mode 100644 database/factories/GoldenProductFactory.php rename database/migrations/{2024_12_02_164715_create_sellers_table.php => 2024_12_02_181739_create_sellers_table.php} (100%) rename database/migrations/{2024_12_02_164716_create_partnerships_table.php => 2024_12_02_181740_create_partnerships_table.php} (100%) rename database/migrations/{2024_12_02_164717_create_seller_data_table.php => 2024_12_02_181741_create_seller_data_table.php} (100%) rename database/migrations/{2024_12_02_164718_create_categories_table.php => 2024_12_02_181742_create_categories_table.php} (100%) rename database/migrations/{2024_12_02_164719_create_seller_products_table.php => 2024_12_02_181743_create_seller_products_table.php} (100%) rename database/migrations/{2024_12_02_164720_create_seller_product_images_table.php => 2024_12_02_181744_create_seller_product_images_table.php} (100%) rename database/migrations/{2024_12_02_164721_create_seller_variants_table.php => 2024_12_02_181745_create_seller_variants_table.php} (100%) rename database/migrations/{2024_12_02_164722_create_prices_table.php => 2024_12_02_181746_create_prices_table.php} (100%) rename database/migrations/{2024_12_02_164723_create_stocks_table.php => 2024_12_02_181747_create_stocks_table.php} (100%) rename database/migrations/{2024_12_02_164724_create_locations_table.php => 2024_12_02_181748_create_locations_table.php} (100%) rename database/migrations/{2024_12_02_164725_create_currencies_table.php => 2024_12_02_181749_create_currencies_table.php} (100%) rename database/migrations/{2024_12_02_164726_create_messages_table.php => 2024_12_02_181750_create_messages_table.php} (100%) rename database/migrations/{2024_12_02_164727_create_product_types_table.php => 2024_12_02_181751_create_product_types_table.php} (100%) rename database/migrations/{2024_12_02_164728_create_product_type_attributes_table.php => 2024_12_02_181752_create_product_type_attributes_table.php} (100%) create mode 100644 database/migrations/2024_12_02_181753_create_golden_products_table.php rename database/migrations/{2024_12_02_164729_create_seller_user_table.php => 2024_12_02_181754_create_seller_user_table.php} (100%) diff --git a/.blueprint b/.blueprint index 67e48f6..d05d570 100644 --- a/.blueprint +++ b/.blueprint @@ -13,21 +13,23 @@ created: - database/factories/MessageFactory.php - database/factories/ProductTypeFactory.php - database/factories/ProductTypeAttributeFactory.php - - database/migrations/2024_12_02_164715_create_sellers_table.php - - database/migrations/2024_12_02_164716_create_partnerships_table.php - - database/migrations/2024_12_02_164717_create_seller_data_table.php - - database/migrations/2024_12_02_164718_create_categories_table.php - - database/migrations/2024_12_02_164719_create_seller_products_table.php - - database/migrations/2024_12_02_164720_create_seller_product_images_table.php - - database/migrations/2024_12_02_164721_create_seller_variants_table.php - - database/migrations/2024_12_02_164722_create_prices_table.php - - database/migrations/2024_12_02_164723_create_stocks_table.php - - database/migrations/2024_12_02_164724_create_locations_table.php - - database/migrations/2024_12_02_164725_create_currencies_table.php - - database/migrations/2024_12_02_164726_create_messages_table.php - - database/migrations/2024_12_02_164727_create_product_types_table.php - - database/migrations/2024_12_02_164728_create_product_type_attributes_table.php - - database/migrations/2024_12_02_164729_create_seller_user_table.php + - database/factories/GoldenProductFactory.php + - database/migrations/2024_12_02_181739_create_sellers_table.php + - database/migrations/2024_12_02_181740_create_partnerships_table.php + - database/migrations/2024_12_02_181741_create_seller_data_table.php + - database/migrations/2024_12_02_181742_create_categories_table.php + - database/migrations/2024_12_02_181743_create_seller_products_table.php + - database/migrations/2024_12_02_181744_create_seller_product_images_table.php + - database/migrations/2024_12_02_181745_create_seller_variants_table.php + - database/migrations/2024_12_02_181746_create_prices_table.php + - database/migrations/2024_12_02_181747_create_stocks_table.php + - database/migrations/2024_12_02_181748_create_locations_table.php + - database/migrations/2024_12_02_181749_create_currencies_table.php + - database/migrations/2024_12_02_181750_create_messages_table.php + - database/migrations/2024_12_02_181751_create_product_types_table.php + - database/migrations/2024_12_02_181752_create_product_type_attributes_table.php + - database/migrations/2024_12_02_181753_create_golden_products_table.php + - database/migrations/2024_12_02_181754_create_seller_user_table.php - app/Models/Seller.php - app/Models/Partnership.php - app/Models/SellerData.php @@ -42,6 +44,7 @@ created: - app/Models/Message.php - app/Models/ProductType.php - app/Models/ProductTypeAttribute.php + - app/Models/GoldenProduct.php models: User: { name: string, email: string, is_seller: "boolean default:'0'", email_verified_at: 'datetime nullable', password: string, remember_token: 'string nullable' } Seller: { name: string, hideProducts: 'boolean default:false', relationships: { belongsToMany: User, hasOne: 'SellerData, Partnership', hasMany: 'SellerProduct, SellerVariant, Price, Stock, Location, Message' } } @@ -56,5 +59,6 @@ models: Location: { name: string, address: string, default_delivery_days: 'integer nullable', seller_id: 'id foreign', relationships: { hasMany: Stock } } Currency: { code: string, symbol: string, name: 'string nullable', is_default: 'boolean default:false', relationships: { hasMany: Price } } Message: { content: text, seller_id: 'id foreign', message_id: 'id foreign nullable' } - ProductType: { name: string, relationships: { hasMany: 'ProductTypeAttribute:attribute' } } + ProductType: { name: string, relationships: { hasMany: 'ProductTypeAttribute:attribute, GoldenProduct:product' } } ProductTypeAttribute: { name: string, type: 'enum:text,boolean,number,select,url,color', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', options: 'json nullable', validators: 'json nullable', product_type_id: 'id foreign' } + GoldenProduct: { name: string, description: 'text nullable', attributes: 'json nullable', product_type_id: 'id foreign' } diff --git a/app/Filament/Owner/Resources/GoldenProductResource.php b/app/Filament/Owner/Resources/GoldenProductResource.php new file mode 100644 index 0000000..6712351 --- /dev/null +++ b/app/Filament/Owner/Resources/GoldenProductResource.php @@ -0,0 +1,190 @@ +schema([ + Section::make('General Information') + ->description('Basic product information and categorization') + ->schema([ + Forms\Components\TextInput::make('name') + ->required(), + Forms\Components\Textarea::make('description') + ->columnSpanFull(), + Forms\Components\Select::make('product_type_id') + ->relationship('productType', 'name') + ->native(false) + ->live() + ->afterStateUpdated(function (Get $get, Set $set) { + $productTypeId = $get('product_type_id'); + if (!$productTypeId) { + $set('attributes', null); + return; + } + + $productType = ProductType::with('attributes')->find($productTypeId); + if (!$productType) return; + + // Initialize empty attributes array + $attributes = collect($get('attributes') ?? []); + + // Update attributes structure based on product type + $newAttributes = $productType->attributes->mapWithKeys(function ($attribute) use ($attributes) { + return [$attribute->name => $attributes[$attribute->name] ?? null]; + })->toArray(); + + $set('attributes', $newAttributes); + }) + ->required(), + ]), + Section::make('Attributes') + ->schema(fn (Get $get): array => static::getAttributeFields($get('product_type_id'))) + ->columns(2) + ->visible(fn (Get $get): bool => (bool) $get('product_type_id')), + ]); + } + + protected static function getAttributeFields(?string $productTypeId): array + { + if (!$productTypeId) return []; + + $productType = ProductType::with('attributes')->find($productTypeId); + if (!$productType) return []; + + return $productType->attributes + ->sortBy('rank') + ->map(function ($attribute) { + $field = match ($attribute->field) { + 'TextInput' => Forms\Components\TextInput::make("attributes.{$attribute->name}") + ->label($attribute->name) + ->helperText($attribute->description) + ->required($attribute->required), + + 'Select' => Forms\Components\Select::make("attributes.{$attribute->name}") + ->label($attribute->name) + ->options(collect($attribute->options)->pluck('value', 'value')->toArray()) + ->helperText($attribute->description) + ->native(false) + ->required($attribute->required), + + 'ColorPicker' => Forms\Components\ColorPicker::make("attributes.{$attribute->name}") + ->label($attribute->name) + ->helperText($attribute->description) + ->required($attribute->required), + + default => Forms\Components\TextInput::make("attributes.{$attribute->name}") + ->label($attribute->name) + ->helperText($attribute->description) + ->required($attribute->required), + }; + + if ($attribute->validators) { + $validators = $attribute->validators ?? []; + + if ($attribute->type === 'number') { + if (isset($validators['min'])) { + $field->minValue((float) $validators['min']); + } + if (isset($validators['max'])) { + $field->maxValue((float) $validators['max']); + } + if (isset($validators['decimal_places'])) { + $field->numeric()->step(pow(0.1, (int) $validators['decimal_places'])); + } + } + + if ($attribute->type === 'text') { + if (isset($validators['min_length'])) { + $field->minLength((int) $validators['min_length']); + } + if (isset($validators['max_length'])) { + $field->maxLength((int) $validators['max_length']); + } + if (isset($validators['pattern'])) { + $field->regex($validators['pattern']); + } + } + } + + return $field; + }) + ->toArray(); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('name') + ->searchable(), + Tables\Columns\TextColumn::make('productType.name') + ->numeric() + ->sortable(), + Tables\Columns\TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->actions([ + Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListGoldenProducts::route('/'), + 'create' => Pages\CreateGoldenProduct::route('/create'), + 'edit' => Pages\EditGoldenProduct::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Owner/Resources/GoldenProductResource/Pages/CreateGoldenProduct.php b/app/Filament/Owner/Resources/GoldenProductResource/Pages/CreateGoldenProduct.php new file mode 100644 index 0000000..d7d7840 --- /dev/null +++ b/app/Filament/Owner/Resources/GoldenProductResource/Pages/CreateGoldenProduct.php @@ -0,0 +1,12 @@ + 'integer', + 'attributes' => 'array', + 'product_type_id' => 'integer', + ]; + + public function productType(): BelongsTo + { + return $this->belongsTo(ProductType::class); + } +} diff --git a/app/Models/ProductType.php b/app/Models/ProductType.php index 55acbeb..3793be9 100644 --- a/app/Models/ProductType.php +++ b/app/Models/ProductType.php @@ -32,4 +32,9 @@ public function attributes(): HasMany { return $this->hasMany(ProductTypeAttribute::class); } + + public function products(): HasMany + { + return $this->hasMany(GoldenProduct::class); + } } diff --git a/database/factories/GoldenProductFactory.php b/database/factories/GoldenProductFactory.php new file mode 100644 index 0000000..e438507 --- /dev/null +++ b/database/factories/GoldenProductFactory.php @@ -0,0 +1,31 @@ + $this->faker->name(), + 'description' => $this->faker->text(), + 'attributes' => '{}', + 'product_type_id' => ProductType::factory(), + ]; + } +} diff --git a/database/migrations/2024_12_02_164715_create_sellers_table.php b/database/migrations/2024_12_02_181739_create_sellers_table.php similarity index 100% rename from database/migrations/2024_12_02_164715_create_sellers_table.php rename to database/migrations/2024_12_02_181739_create_sellers_table.php diff --git a/database/migrations/2024_12_02_164716_create_partnerships_table.php b/database/migrations/2024_12_02_181740_create_partnerships_table.php similarity index 100% rename from database/migrations/2024_12_02_164716_create_partnerships_table.php rename to database/migrations/2024_12_02_181740_create_partnerships_table.php diff --git a/database/migrations/2024_12_02_164717_create_seller_data_table.php b/database/migrations/2024_12_02_181741_create_seller_data_table.php similarity index 100% rename from database/migrations/2024_12_02_164717_create_seller_data_table.php rename to database/migrations/2024_12_02_181741_create_seller_data_table.php diff --git a/database/migrations/2024_12_02_164718_create_categories_table.php b/database/migrations/2024_12_02_181742_create_categories_table.php similarity index 100% rename from database/migrations/2024_12_02_164718_create_categories_table.php rename to database/migrations/2024_12_02_181742_create_categories_table.php diff --git a/database/migrations/2024_12_02_164719_create_seller_products_table.php b/database/migrations/2024_12_02_181743_create_seller_products_table.php similarity index 100% rename from database/migrations/2024_12_02_164719_create_seller_products_table.php rename to database/migrations/2024_12_02_181743_create_seller_products_table.php diff --git a/database/migrations/2024_12_02_164720_create_seller_product_images_table.php b/database/migrations/2024_12_02_181744_create_seller_product_images_table.php similarity index 100% rename from database/migrations/2024_12_02_164720_create_seller_product_images_table.php rename to database/migrations/2024_12_02_181744_create_seller_product_images_table.php diff --git a/database/migrations/2024_12_02_164721_create_seller_variants_table.php b/database/migrations/2024_12_02_181745_create_seller_variants_table.php similarity index 100% rename from database/migrations/2024_12_02_164721_create_seller_variants_table.php rename to database/migrations/2024_12_02_181745_create_seller_variants_table.php diff --git a/database/migrations/2024_12_02_164722_create_prices_table.php b/database/migrations/2024_12_02_181746_create_prices_table.php similarity index 100% rename from database/migrations/2024_12_02_164722_create_prices_table.php rename to database/migrations/2024_12_02_181746_create_prices_table.php diff --git a/database/migrations/2024_12_02_164723_create_stocks_table.php b/database/migrations/2024_12_02_181747_create_stocks_table.php similarity index 100% rename from database/migrations/2024_12_02_164723_create_stocks_table.php rename to database/migrations/2024_12_02_181747_create_stocks_table.php diff --git a/database/migrations/2024_12_02_164724_create_locations_table.php b/database/migrations/2024_12_02_181748_create_locations_table.php similarity index 100% rename from database/migrations/2024_12_02_164724_create_locations_table.php rename to database/migrations/2024_12_02_181748_create_locations_table.php diff --git a/database/migrations/2024_12_02_164725_create_currencies_table.php b/database/migrations/2024_12_02_181749_create_currencies_table.php similarity index 100% rename from database/migrations/2024_12_02_164725_create_currencies_table.php rename to database/migrations/2024_12_02_181749_create_currencies_table.php diff --git a/database/migrations/2024_12_02_164726_create_messages_table.php b/database/migrations/2024_12_02_181750_create_messages_table.php similarity index 100% rename from database/migrations/2024_12_02_164726_create_messages_table.php rename to database/migrations/2024_12_02_181750_create_messages_table.php diff --git a/database/migrations/2024_12_02_164727_create_product_types_table.php b/database/migrations/2024_12_02_181751_create_product_types_table.php similarity index 100% rename from database/migrations/2024_12_02_164727_create_product_types_table.php rename to database/migrations/2024_12_02_181751_create_product_types_table.php diff --git a/database/migrations/2024_12_02_164728_create_product_type_attributes_table.php b/database/migrations/2024_12_02_181752_create_product_type_attributes_table.php similarity index 100% rename from database/migrations/2024_12_02_164728_create_product_type_attributes_table.php rename to database/migrations/2024_12_02_181752_create_product_type_attributes_table.php diff --git a/database/migrations/2024_12_02_181753_create_golden_products_table.php b/database/migrations/2024_12_02_181753_create_golden_products_table.php new file mode 100644 index 0000000..943abd7 --- /dev/null +++ b/database/migrations/2024_12_02_181753_create_golden_products_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('name'); + $table->text('description')->nullable(); + $table->json('attributes')->nullable(); + $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_products'); + } +}; diff --git a/database/migrations/2024_12_02_164729_create_seller_user_table.php b/database/migrations/2024_12_02_181754_create_seller_user_table.php similarity index 100% rename from database/migrations/2024_12_02_164729_create_seller_user_table.php rename to database/migrations/2024_12_02_181754_create_seller_user_table.php diff --git a/draft.yaml b/draft.yaml index 590a3bb..2d74e03 100644 --- a/draft.yaml +++ b/draft.yaml @@ -119,7 +119,7 @@ models: ProductType: name: string relationships: - hasMany: ProductTypeAttribute:attribute + hasMany: ProductTypeAttribute:attribute, GoldenProduct:product ProductTypeAttribute: name: string @@ -134,5 +134,11 @@ models: validators: json nullable product_type_id: id foreign + GoldenProduct: + name: string + description: text nullable + attributes: json nullable + product_type_id: id foreign + controllers: # ... From 0a5751141dd85ee9b40567bde0adf5168f6fc056 Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Mon, 2 Dec 2024 20:34:06 +0100 Subject: [PATCH 03/19] ... --- .blueprint | 44 ++-- .../Owner/Resources/GoldenProductResource.php | 192 ++++++++++++++++-- .../Pages/EditGoldenProduct.php | 22 ++ .../AttributesRelationManager.php | 5 + app/Models/GoldenProduct.php | 10 +- app/Models/GoldenProductLocalized.php | 54 +++++ app/Models/Locale.php | 32 +++ app/Models/ProductTypeAttribute.php | 2 + app/Providers/Filament/OwnerPanelProvider.php | 5 +- database/factories/GoldenProductFactory.php | 3 - .../GoldenProductLocalizedFactory.php | 35 ++++ database/factories/LocaleFactory.php | 29 +++ .../factories/ProductTypeAttributeFactory.php | 1 + ...024_12_02_185412_create_sellers_table.php} | 0 ...2_02_185413_create_partnerships_table.php} | 0 ...12_02_185414_create_seller_data_table.php} | 0 ..._12_02_185415_create_categories_table.php} | 0 ...2_185416_create_seller_products_table.php} | 0 ...17_create_seller_product_images_table.php} | 0 ...2_185418_create_seller_variants_table.php} | 0 ...2024_12_02_185419_create_prices_table.php} | 0 ...2024_12_02_185420_create_stocks_table.php} | 0 ...4_12_02_185421_create_locations_table.php} | 0 ..._12_02_185422_create_currencies_table.php} | 0 ...24_12_02_185423_create_messages_table.php} | 0 ..._02_185424_create_product_types_table.php} | 0 ..._create_product_type_attributes_table.php} | 1 + ...2_185426_create_golden_products_table.php} | 3 - ...create_golden_product_localizeds_table.php | 37 ++++ ...2024_12_02_185428_create_locales_table.php | 34 ++++ ...12_02_185429_create_seller_user_table.php} | 0 database/seeders/DatabaseSeeder.php | 175 +++++++++++++++- draft.yaml | 13 ++ specs.md | 4 + 34 files changed, 651 insertions(+), 50 deletions(-) create mode 100644 app/Models/GoldenProductLocalized.php create mode 100644 app/Models/Locale.php create mode 100644 database/factories/GoldenProductLocalizedFactory.php create mode 100644 database/factories/LocaleFactory.php rename database/migrations/{2024_12_02_181739_create_sellers_table.php => 2024_12_02_185412_create_sellers_table.php} (100%) rename database/migrations/{2024_12_02_181740_create_partnerships_table.php => 2024_12_02_185413_create_partnerships_table.php} (100%) rename database/migrations/{2024_12_02_181741_create_seller_data_table.php => 2024_12_02_185414_create_seller_data_table.php} (100%) rename database/migrations/{2024_12_02_181742_create_categories_table.php => 2024_12_02_185415_create_categories_table.php} (100%) rename database/migrations/{2024_12_02_181743_create_seller_products_table.php => 2024_12_02_185416_create_seller_products_table.php} (100%) rename database/migrations/{2024_12_02_181744_create_seller_product_images_table.php => 2024_12_02_185417_create_seller_product_images_table.php} (100%) rename database/migrations/{2024_12_02_181745_create_seller_variants_table.php => 2024_12_02_185418_create_seller_variants_table.php} (100%) rename database/migrations/{2024_12_02_181746_create_prices_table.php => 2024_12_02_185419_create_prices_table.php} (100%) rename database/migrations/{2024_12_02_181747_create_stocks_table.php => 2024_12_02_185420_create_stocks_table.php} (100%) rename database/migrations/{2024_12_02_181748_create_locations_table.php => 2024_12_02_185421_create_locations_table.php} (100%) rename database/migrations/{2024_12_02_181749_create_currencies_table.php => 2024_12_02_185422_create_currencies_table.php} (100%) rename database/migrations/{2024_12_02_181750_create_messages_table.php => 2024_12_02_185423_create_messages_table.php} (100%) rename database/migrations/{2024_12_02_181751_create_product_types_table.php => 2024_12_02_185424_create_product_types_table.php} (100%) rename database/migrations/{2024_12_02_181752_create_product_type_attributes_table.php => 2024_12_02_185425_create_product_type_attributes_table.php} (95%) rename database/migrations/{2024_12_02_181753_create_golden_products_table.php => 2024_12_02_185426_create_golden_products_table.php} (84%) create mode 100644 database/migrations/2024_12_02_185427_create_golden_product_localizeds_table.php create mode 100644 database/migrations/2024_12_02_185428_create_locales_table.php rename database/migrations/{2024_12_02_181754_create_seller_user_table.php => 2024_12_02_185429_create_seller_user_table.php} (100%) diff --git a/.blueprint b/.blueprint index d05d570..dda78e5 100644 --- a/.blueprint +++ b/.blueprint @@ -14,22 +14,26 @@ created: - database/factories/ProductTypeFactory.php - database/factories/ProductTypeAttributeFactory.php - database/factories/GoldenProductFactory.php - - database/migrations/2024_12_02_181739_create_sellers_table.php - - database/migrations/2024_12_02_181740_create_partnerships_table.php - - database/migrations/2024_12_02_181741_create_seller_data_table.php - - database/migrations/2024_12_02_181742_create_categories_table.php - - database/migrations/2024_12_02_181743_create_seller_products_table.php - - database/migrations/2024_12_02_181744_create_seller_product_images_table.php - - database/migrations/2024_12_02_181745_create_seller_variants_table.php - - database/migrations/2024_12_02_181746_create_prices_table.php - - database/migrations/2024_12_02_181747_create_stocks_table.php - - database/migrations/2024_12_02_181748_create_locations_table.php - - database/migrations/2024_12_02_181749_create_currencies_table.php - - database/migrations/2024_12_02_181750_create_messages_table.php - - database/migrations/2024_12_02_181751_create_product_types_table.php - - database/migrations/2024_12_02_181752_create_product_type_attributes_table.php - - database/migrations/2024_12_02_181753_create_golden_products_table.php - - database/migrations/2024_12_02_181754_create_seller_user_table.php + - database/factories/GoldenProductLocalizedFactory.php + - database/factories/LocaleFactory.php + - database/migrations/2024_12_02_185412_create_sellers_table.php + - database/migrations/2024_12_02_185413_create_partnerships_table.php + - database/migrations/2024_12_02_185414_create_seller_data_table.php + - database/migrations/2024_12_02_185415_create_categories_table.php + - database/migrations/2024_12_02_185416_create_seller_products_table.php + - database/migrations/2024_12_02_185417_create_seller_product_images_table.php + - database/migrations/2024_12_02_185418_create_seller_variants_table.php + - database/migrations/2024_12_02_185419_create_prices_table.php + - database/migrations/2024_12_02_185420_create_stocks_table.php + - database/migrations/2024_12_02_185421_create_locations_table.php + - database/migrations/2024_12_02_185422_create_currencies_table.php + - database/migrations/2024_12_02_185423_create_messages_table.php + - database/migrations/2024_12_02_185424_create_product_types_table.php + - database/migrations/2024_12_02_185425_create_product_type_attributes_table.php + - database/migrations/2024_12_02_185426_create_golden_products_table.php + - database/migrations/2024_12_02_185427_create_golden_product_localizeds_table.php + - database/migrations/2024_12_02_185428_create_locales_table.php + - database/migrations/2024_12_02_185429_create_seller_user_table.php - app/Models/Seller.php - app/Models/Partnership.php - app/Models/SellerData.php @@ -45,6 +49,8 @@ created: - app/Models/ProductType.php - app/Models/ProductTypeAttribute.php - app/Models/GoldenProduct.php + - app/Models/GoldenProductLocalized.php + - app/Models/Locale.php models: User: { name: string, email: string, is_seller: "boolean default:'0'", email_verified_at: 'datetime nullable', password: string, remember_token: 'string nullable' } Seller: { name: string, hideProducts: 'boolean default:false', relationships: { belongsToMany: User, hasOne: 'SellerData, Partnership', hasMany: 'SellerProduct, SellerVariant, Price, Stock, Location, Message' } } @@ -60,5 +66,7 @@ models: Currency: { code: string, symbol: string, name: 'string nullable', is_default: 'boolean default:false', relationships: { hasMany: Price } } Message: { content: text, seller_id: 'id foreign', message_id: 'id foreign nullable' } ProductType: { name: string, relationships: { hasMany: 'ProductTypeAttribute:attribute, GoldenProduct:product' } } - ProductTypeAttribute: { name: string, type: 'enum:text,boolean,number,select,url,color', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', options: 'json nullable', validators: 'json nullable', product_type_id: 'id foreign' } - GoldenProduct: { name: string, description: 'text nullable', attributes: 'json nullable', product_type_id: 'id foreign' } + ProductTypeAttribute: { name: string, type: 'enum:text,boolean,number,select,url,color', is_translatable: 'boolean default:false', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', options: 'json nullable', validators: 'json nullable', product_type_id: 'id foreign' } + GoldenProduct: { product_type_id: 'id foreign', relationships: { hasMany: 'GoldenProductLocalized:translation' } } + GoldenProductLocalized: { name: string, description: 'text nullable', attributes: 'json nullable', product_type_id: 'id foreign', locale_id: 'id foreign', golden_product_id: 'id foreign' } + Locale: { code: string, name: string, default: boolean } diff --git a/app/Filament/Owner/Resources/GoldenProductResource.php b/app/Filament/Owner/Resources/GoldenProductResource.php index 6712351..c70896e 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource.php +++ b/app/Filament/Owner/Resources/GoldenProductResource.php @@ -5,6 +5,7 @@ use App\Filament\Owner\Resources\GoldenProductResource\Pages; use App\Filament\Owner\Resources\GoldenProductResource\RelationManagers; use App\Models\GoldenProduct; +use App\Models\GoldenProductLocalized; use App\Models\ProductType; use Filament\Forms; use Filament\Forms\Components\Section; @@ -15,8 +16,10 @@ use Filament\Tables; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletingScope; use Illuminate\Support\Collection; +use App\Models\Locale; class GoldenProductResource extends Resource { @@ -30,17 +33,87 @@ class GoldenProductResource extends Resource protected static ?int $navigationGroupSort = 10; + public static function getRecordTitle(?Model $record): string|null + { + return $record?->translations() + ->whereHas('locale', fn($query) => $query->where('default', true)) + ->first()?->name; + } + public static function form(Form $form): Form { return $form ->schema([ + Forms\Components\Select::make('active_locale') + ->options(function () { + return Locale::query() + ->orderBy('default', 'desc') + ->orderBy('name') + ->pluck('name', 'id'); + }) + ->default(function (Get $get) { + $defaultLocale = Locale::where('default', true)->first(); + return $defaultLocale ? $defaultLocale->id : null; + }) + ->live() + ->afterStateUpdated(function ($state, Set $set, Get $get) { + $locale = Locale::find($state); + if (!$locale) return; + + $record = GoldenProduct::find($get('id')); + if (!$record) return; + + $translation = $record->translations() + ->where('locale_id', $locale->id) + ->first(); + + if ($translation) { + $set('name', $translation->name); + $set('description', $translation->description); + $set('attributes', $translation->attributes ?? []); + } else { + $set('name', ''); + $set('description', ''); + $set('attributes', []); + } + }) + ->selectablePlaceholder(false) + ->extraAttributes([ + 'class' => 'ml-auto w-[200px]' + ]), + Section::make('General Information') ->description('Basic product information and categorization') ->schema([ Forms\Components\TextInput::make('name') - ->required(), + ->required() + ->afterStateHydrated(function ($component, $state, $record) { + if (!$state && $record) { + $defaultLocale = Locale::where('default', true)->first(); + if (!$defaultLocale) return; + + $translation = $record->translations() + ->where('locale_id', $defaultLocale->id) + ->first(); + + $component->state($translation?->name); + } + }), Forms\Components\Textarea::make('description') - ->columnSpanFull(), + ->columnSpanFull() + ->afterStateHydrated(function ($component, $state, $record) { + if (!$state && $record) { + $defaultLocale = Locale::where('default', true)->first(); + if (!$defaultLocale) return; + + $translation = $record->translations() + ->where('locale_id', $defaultLocale->id) + ->first(); + + $component->state($translation?->description); + } + }), + Forms\Components\Select::make('product_type_id') ->relationship('productType', 'name') ->native(false) @@ -55,22 +128,21 @@ public static function form(Form $form): Form $productType = ProductType::with('attributes')->find($productTypeId); if (!$productType) return; - // Initialize empty attributes array $attributes = collect($get('attributes') ?? []); - - // Update attributes structure based on product type + $newAttributes = $productType->attributes->mapWithKeys(function ($attribute) use ($attributes) { return [$attribute->name => $attributes[$attribute->name] ?? null]; })->toArray(); - + $set('attributes', $newAttributes); }) ->required(), ]), + Section::make('Attributes') - ->schema(fn (Get $get): array => static::getAttributeFields($get('product_type_id'))) + ->schema(fn(Get $get): array => static::getAttributeFields($get('product_type_id'))) ->columns(2) - ->visible(fn (Get $get): bool => (bool) $get('product_type_id')), + ->visible(fn(Get $get): bool => (bool) $get('product_type_id')), ]); } @@ -84,33 +156,47 @@ protected static function getAttributeFields(?string $productTypeId): array return $productType->attributes ->sortBy('rank') ->map(function ($attribute) { - $field = match ($attribute->field) { + $baseField = match ($attribute->field) { 'TextInput' => Forms\Components\TextInput::make("attributes.{$attribute->name}") ->label($attribute->name) ->helperText($attribute->description) ->required($attribute->required), - + 'Select' => Forms\Components\Select::make("attributes.{$attribute->name}") ->label($attribute->name) ->options(collect($attribute->options)->pluck('value', 'value')->toArray()) ->helperText($attribute->description) ->native(false) ->required($attribute->required), - + 'ColorPicker' => Forms\Components\ColorPicker::make("attributes.{$attribute->name}") ->label($attribute->name) ->helperText($attribute->description) ->required($attribute->required), - + default => Forms\Components\TextInput::make("attributes.{$attribute->name}") ->label($attribute->name) ->helperText($attribute->description) ->required($attribute->required), }; + $field = $baseField->afterStateHydrated(function ($component, $state, $record) use ($attribute) { + if (!$state && $record) { + $defaultLocale = Locale::where('default', true)->first(); + if (!$defaultLocale) return; + + $translation = $record->translations() + ->where('locale_id', $defaultLocale->id) + ->first(); + + $attributes = $translation?->attributes ?? []; + $component->state($attributes[$attribute->name] ?? null); + } + }); + if ($attribute->validators) { - $validators = $attribute->validators ?? []; - + $validators = $attribute->validators; + if ($attribute->type === 'number') { if (isset($validators['min'])) { $field->minValue((float) $validators['min']); @@ -122,7 +208,7 @@ protected static function getAttributeFields(?string $productTypeId): array $field->numeric()->step(pow(0.1, (int) $validators['decimal_places'])); } } - + if ($attribute->type === 'text') { if (isset($validators['min_length'])) { $field->minLength((int) $validators['min_length']); @@ -141,14 +227,84 @@ protected static function getAttributeFields(?string $productTypeId): array ->toArray(); } + protected function handleRecordCreation(array $data): Model + { + $localeId = $data['active_locale'] ?? Locale::where('default', true)->first()?->id; + + $record = new GoldenProduct([ + 'product_type_id' => $data['product_type_id'], + ]); + $record->save(); + + $record->translations()->create([ + 'locale_id' => $localeId, + 'name' => $data['name'], + 'description' => $data['description'], + 'attributes' => $data['attributes'] ?? [], + 'product_type_id' => $data['product_type_id'], + ]); + + return $record; + } + + protected function handleRecordUpdate(Model $record, array $data): Model + { + $localeId = $data['active_locale'] ?? Locale::where('default', true)->first()?->id; + + $record->update([ + 'product_type_id' => $data['product_type_id'], + ]); + + $translation = $record->translations()->updateOrCreate( + ['locale_id' => $localeId], + [ + 'name' => $data['name'], + 'description' => $data['description'], + 'attributes' => $data['attributes'] ?? [], + 'product_type_id' => $data['product_type_id'], + ] + ); + + return $record; + } + public static function table(Table $table): Table { return $table ->columns([ - Tables\Columns\TextColumn::make('name') - ->searchable(), + Tables\Columns\TextColumn::make('translations.name') + ->label('Name') + ->getStateUsing(function ($record) { + return $record->translations() + ->whereHas('locale', fn($query) => $query->where('default', true)) + ->first()?->name; + }) + ->searchable(query: function (Builder $query, string $search): Builder { + return $query->whereHas('translations', function ($query) use ($search) { + $query->where('name', 'like', "%{$search}%") + ->whereHas('locale', fn($q) => $q->where('default', true)); + }); + }) + ->sortable(query: function (Builder $query, string $direction): Builder { + return $query->orderBy( + GoldenProductLocalized::select('name') + ->whereColumn('golden_product_id', 'golden_products.id') + ->whereHas('locale', fn($q) => $q->where('default', true)) + ->limit(1), + $direction + ); + }), + Tables\Columns\TextColumn::make('translations.description') + ->label('Description') + ->getStateUsing(function ($record) { + return $record->translations() + ->whereHas('locale', fn($query) => $query->where('default', true)) + ->first()?->description; + }) + ->limit(50) + ->toggleable(), Tables\Columns\TextColumn::make('productType.name') - ->numeric() + ->label('Product Type') ->sortable(), Tables\Columns\TextColumn::make('created_at') ->dateTime() diff --git a/app/Filament/Owner/Resources/GoldenProductResource/Pages/EditGoldenProduct.php b/app/Filament/Owner/Resources/GoldenProductResource/Pages/EditGoldenProduct.php index 77eb132..6ae3643 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource/Pages/EditGoldenProduct.php +++ b/app/Filament/Owner/Resources/GoldenProductResource/Pages/EditGoldenProduct.php @@ -5,6 +5,7 @@ use App\Filament\Owner\Resources\GoldenProductResource; use Filament\Actions; use Filament\Resources\Pages\EditRecord; +use Illuminate\Database\Eloquent\Model; class EditGoldenProduct extends EditRecord { @@ -16,4 +17,25 @@ protected function getHeaderActions(): array Actions\DeleteAction::make(), ]; } + + protected function handleRecordUpdate(Model $record, array $data): Model + { + $localeId = $data['active_locale']; + + $record->update([ + 'product_type_id' => $data['product_type_id'], + ]); + + $record->translations()->updateOrCreate( + ['locale_id' => $localeId], + [ + 'name' => $data['name'], + 'description' => $data['description'], + 'attributes' => $data['attributes'] ?? [], + 'product_type_id' => $data['product_type_id'], + ] + ); + + return $record; + } } diff --git a/app/Filament/Owner/Resources/ProductTypeResource/RelationManagers/AttributesRelationManager.php b/app/Filament/Owner/Resources/ProductTypeResource/RelationManagers/AttributesRelationManager.php index e57702c..ae0b8f9 100644 --- a/app/Filament/Owner/Resources/ProductTypeResource/RelationManagers/AttributesRelationManager.php +++ b/app/Filament/Owner/Resources/ProductTypeResource/RelationManagers/AttributesRelationManager.php @@ -24,6 +24,7 @@ public function form(Form $form): Form ->required() ->maxLength(255) ->label('Attribute Name') + ->columnSpan(2) ->placeholder('e.g., Color, Size, Material') ->helperText('Enter a unique, descriptive name for this attribute.'), @@ -31,6 +32,10 @@ public function form(Form $form): Form ->label('Is Variant Attribute') ->helperText('Enable this if this attribute differs between product variants'), + Forms\Components\Toggle::make('is_translatable') + ->label('Is Translatable') + ->helperText('Enable this if this attribute needs to be translated into different languages'), + Forms\Components\Textarea::make('description') ->maxLength(255) ->columnSpan(2) diff --git a/app/Models/GoldenProduct.php b/app/Models/GoldenProduct.php index 3bb0a1a..fcd612a 100644 --- a/app/Models/GoldenProduct.php +++ b/app/Models/GoldenProduct.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; class GoldenProduct extends Model { @@ -16,9 +17,6 @@ class GoldenProduct extends Model * @var array */ protected $fillable = [ - 'name', - 'description', - 'attributes', 'product_type_id', ]; @@ -29,10 +27,14 @@ class GoldenProduct extends Model */ protected $casts = [ 'id' => 'integer', - 'attributes' => 'array', 'product_type_id' => 'integer', ]; + public function translations(): HasMany + { + return $this->hasMany(GoldenProductLocalized::class); + } + public function productType(): BelongsTo { return $this->belongsTo(ProductType::class); diff --git a/app/Models/GoldenProductLocalized.php b/app/Models/GoldenProductLocalized.php new file mode 100644 index 0000000..55f2dac --- /dev/null +++ b/app/Models/GoldenProductLocalized.php @@ -0,0 +1,54 @@ + 'integer', + 'attributes' => 'array', + 'product_type_id' => 'integer', + 'locale_id' => 'integer', + 'golden_product_id' => 'integer', + ]; + + public function productType(): BelongsTo + { + return $this->belongsTo(ProductType::class); + } + + public function locale(): BelongsTo + { + return $this->belongsTo(Locale::class); + } + + public function goldenProduct(): BelongsTo + { + return $this->belongsTo(GoldenProduct::class); + } +} diff --git a/app/Models/Locale.php b/app/Models/Locale.php new file mode 100644 index 0000000..66dfc5d --- /dev/null +++ b/app/Models/Locale.php @@ -0,0 +1,32 @@ + 'integer', + 'default' => 'boolean', + ]; +} diff --git a/app/Models/ProductTypeAttribute.php b/app/Models/ProductTypeAttribute.php index d6080fa..947e261 100644 --- a/app/Models/ProductTypeAttribute.php +++ b/app/Models/ProductTypeAttribute.php @@ -18,6 +18,7 @@ class ProductTypeAttribute extends Model protected $fillable = [ 'name', 'type', + 'is_translatable', 'field', 'required', 'rank', @@ -36,6 +37,7 @@ class ProductTypeAttribute extends Model */ protected $casts = [ 'id' => 'integer', + 'is_translatable' => 'boolean', 'required' => 'boolean', 'is_variant_attribute' => 'boolean', 'options' => 'array', diff --git a/app/Providers/Filament/OwnerPanelProvider.php b/app/Providers/Filament/OwnerPanelProvider.php index 5d453ee..9265a0a 100644 --- a/app/Providers/Filament/OwnerPanelProvider.php +++ b/app/Providers/Filament/OwnerPanelProvider.php @@ -32,8 +32,11 @@ public function panel(Panel $panel): Panel ->profile() ->brandName('Owner Center') ->colors([ - 'primary' => Color::Emerald, + 'primary' => Color::Indigo, + 'secondary' => Color::Cyan, + 'gray' => Color::Slate, ]) + ->darkMode() ->discoverResources(in: app_path('Filament/Owner/Resources'), for: 'App\\Filament\\Owner\\Resources') ->discoverPages(in: app_path('Filament/Owner/Pages'), for: 'App\\Filament\\Owner\\Pages') ->pages([ diff --git a/database/factories/GoldenProductFactory.php b/database/factories/GoldenProductFactory.php index e438507..4422231 100644 --- a/database/factories/GoldenProductFactory.php +++ b/database/factories/GoldenProductFactory.php @@ -22,9 +22,6 @@ class GoldenProductFactory extends Factory public function definition(): array { return [ - 'name' => $this->faker->name(), - 'description' => $this->faker->text(), - 'attributes' => '{}', 'product_type_id' => ProductType::factory(), ]; } diff --git a/database/factories/GoldenProductLocalizedFactory.php b/database/factories/GoldenProductLocalizedFactory.php new file mode 100644 index 0000000..84a4b56 --- /dev/null +++ b/database/factories/GoldenProductLocalizedFactory.php @@ -0,0 +1,35 @@ + $this->faker->name(), + 'description' => $this->faker->text(), + 'attributes' => '{}', + 'product_type_id' => ProductType::factory(), + 'locale_id' => Locale::factory(), + 'golden_product_id' => GoldenProduct::factory(), + ]; + } +} diff --git a/database/factories/LocaleFactory.php b/database/factories/LocaleFactory.php new file mode 100644 index 0000000..4ffde82 --- /dev/null +++ b/database/factories/LocaleFactory.php @@ -0,0 +1,29 @@ + $this->faker->word(), + 'name' => $this->faker->name(), + 'default' => $this->faker->boolean(), + ]; + } +} diff --git a/database/factories/ProductTypeAttributeFactory.php b/database/factories/ProductTypeAttributeFactory.php index 07db76a..b302940 100644 --- a/database/factories/ProductTypeAttributeFactory.php +++ b/database/factories/ProductTypeAttributeFactory.php @@ -24,6 +24,7 @@ public function definition(): array return [ 'name' => $this->faker->name(), 'type' => $this->faker->randomElement(["text","boolean","number","select","url","color"]), + 'is_translatable' => $this->faker->boolean(), 'field' => $this->faker->randomElement(["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]), 'required' => $this->faker->boolean(), 'rank' => $this->faker->numberBetween(-10000, 10000), diff --git a/database/migrations/2024_12_02_181739_create_sellers_table.php b/database/migrations/2024_12_02_185412_create_sellers_table.php similarity index 100% rename from database/migrations/2024_12_02_181739_create_sellers_table.php rename to database/migrations/2024_12_02_185412_create_sellers_table.php diff --git a/database/migrations/2024_12_02_181740_create_partnerships_table.php b/database/migrations/2024_12_02_185413_create_partnerships_table.php similarity index 100% rename from database/migrations/2024_12_02_181740_create_partnerships_table.php rename to database/migrations/2024_12_02_185413_create_partnerships_table.php diff --git a/database/migrations/2024_12_02_181741_create_seller_data_table.php b/database/migrations/2024_12_02_185414_create_seller_data_table.php similarity index 100% rename from database/migrations/2024_12_02_181741_create_seller_data_table.php rename to database/migrations/2024_12_02_185414_create_seller_data_table.php diff --git a/database/migrations/2024_12_02_181742_create_categories_table.php b/database/migrations/2024_12_02_185415_create_categories_table.php similarity index 100% rename from database/migrations/2024_12_02_181742_create_categories_table.php rename to database/migrations/2024_12_02_185415_create_categories_table.php diff --git a/database/migrations/2024_12_02_181743_create_seller_products_table.php b/database/migrations/2024_12_02_185416_create_seller_products_table.php similarity index 100% rename from database/migrations/2024_12_02_181743_create_seller_products_table.php rename to database/migrations/2024_12_02_185416_create_seller_products_table.php diff --git a/database/migrations/2024_12_02_181744_create_seller_product_images_table.php b/database/migrations/2024_12_02_185417_create_seller_product_images_table.php similarity index 100% rename from database/migrations/2024_12_02_181744_create_seller_product_images_table.php rename to database/migrations/2024_12_02_185417_create_seller_product_images_table.php diff --git a/database/migrations/2024_12_02_181745_create_seller_variants_table.php b/database/migrations/2024_12_02_185418_create_seller_variants_table.php similarity index 100% rename from database/migrations/2024_12_02_181745_create_seller_variants_table.php rename to database/migrations/2024_12_02_185418_create_seller_variants_table.php diff --git a/database/migrations/2024_12_02_181746_create_prices_table.php b/database/migrations/2024_12_02_185419_create_prices_table.php similarity index 100% rename from database/migrations/2024_12_02_181746_create_prices_table.php rename to database/migrations/2024_12_02_185419_create_prices_table.php diff --git a/database/migrations/2024_12_02_181747_create_stocks_table.php b/database/migrations/2024_12_02_185420_create_stocks_table.php similarity index 100% rename from database/migrations/2024_12_02_181747_create_stocks_table.php rename to database/migrations/2024_12_02_185420_create_stocks_table.php diff --git a/database/migrations/2024_12_02_181748_create_locations_table.php b/database/migrations/2024_12_02_185421_create_locations_table.php similarity index 100% rename from database/migrations/2024_12_02_181748_create_locations_table.php rename to database/migrations/2024_12_02_185421_create_locations_table.php diff --git a/database/migrations/2024_12_02_181749_create_currencies_table.php b/database/migrations/2024_12_02_185422_create_currencies_table.php similarity index 100% rename from database/migrations/2024_12_02_181749_create_currencies_table.php rename to database/migrations/2024_12_02_185422_create_currencies_table.php diff --git a/database/migrations/2024_12_02_181750_create_messages_table.php b/database/migrations/2024_12_02_185423_create_messages_table.php similarity index 100% rename from database/migrations/2024_12_02_181750_create_messages_table.php rename to database/migrations/2024_12_02_185423_create_messages_table.php diff --git a/database/migrations/2024_12_02_181751_create_product_types_table.php b/database/migrations/2024_12_02_185424_create_product_types_table.php similarity index 100% rename from database/migrations/2024_12_02_181751_create_product_types_table.php rename to database/migrations/2024_12_02_185424_create_product_types_table.php diff --git a/database/migrations/2024_12_02_181752_create_product_type_attributes_table.php b/database/migrations/2024_12_02_185425_create_product_type_attributes_table.php similarity index 95% rename from database/migrations/2024_12_02_181752_create_product_type_attributes_table.php rename to database/migrations/2024_12_02_185425_create_product_type_attributes_table.php index 8c8f77d..19c0375 100644 --- a/database/migrations/2024_12_02_181752_create_product_type_attributes_table.php +++ b/database/migrations/2024_12_02_185425_create_product_type_attributes_table.php @@ -17,6 +17,7 @@ public function up(): void $table->id(); $table->string('name'); $table->enum('type', ["text","boolean","number","select","url","color"]); + $table->boolean('is_translatable')->default(false); $table->enum('field', ["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]); $table->boolean('required')->default(false); $table->integer('rank')->default(0); diff --git a/database/migrations/2024_12_02_181753_create_golden_products_table.php b/database/migrations/2024_12_02_185426_create_golden_products_table.php similarity index 84% rename from database/migrations/2024_12_02_181753_create_golden_products_table.php rename to database/migrations/2024_12_02_185426_create_golden_products_table.php index 943abd7..aa1610f 100644 --- a/database/migrations/2024_12_02_181753_create_golden_products_table.php +++ b/database/migrations/2024_12_02_185426_create_golden_products_table.php @@ -15,9 +15,6 @@ public function up(): void Schema::create('golden_products', function (Blueprint $table) { $table->id(); - $table->string('name'); - $table->text('description')->nullable(); - $table->json('attributes')->nullable(); $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_02_185427_create_golden_product_localizeds_table.php b/database/migrations/2024_12_02_185427_create_golden_product_localizeds_table.php new file mode 100644 index 0000000..a9b0945 --- /dev/null +++ b/database/migrations/2024_12_02_185427_create_golden_product_localizeds_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->text('description')->nullable(); + $table->json('attributes')->nullable(); + $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('locale_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('golden_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_product_localizeds'); + } +}; diff --git a/database/migrations/2024_12_02_185428_create_locales_table.php b/database/migrations/2024_12_02_185428_create_locales_table.php new file mode 100644 index 0000000..272da91 --- /dev/null +++ b/database/migrations/2024_12_02_185428_create_locales_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('code'); + $table->string('name'); + $table->boolean('default'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('locales'); + } +}; diff --git a/database/migrations/2024_12_02_181754_create_seller_user_table.php b/database/migrations/2024_12_02_185429_create_seller_user_table.php similarity index 100% rename from database/migrations/2024_12_02_181754_create_seller_user_table.php rename to database/migrations/2024_12_02_185429_create_seller_user_table.php diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 548a6c4..bfb943a 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -14,7 +14,9 @@ use App\Models\Operator; use App\Models\Partnership; use App\Models\ProductType; +use App\Models\GoldenProduct; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\DB; class DatabaseSeeder extends Seeder { @@ -760,6 +762,7 @@ public function run(): void 'field' => 'Select', 'description' => 'Standard t-shirt size using international sizing system (XS to XL)', 'is_variant_attribute' => true, + 'is_translatable' => false, 'rank' => 1, 'options' => [ ['label' => 'Extra Small', 'value' => 'XS'], @@ -775,6 +778,7 @@ public function run(): void 'field' => 'ColorPicker', 'description' => 'Main color of the t-shirt. For multi-colored shirts, choose the dominant color', 'is_variant_attribute' => true, + 'is_translatable' => false, 'rank' => 2, ], [ @@ -783,6 +787,7 @@ public function run(): void 'field' => 'TextInput', 'description' => 'Fabric composition (e.g., "100% Cotton" or "95% Cotton, 5% Elastane")', 'is_variant_attribute' => false, + 'is_translatable' => true, 'rank' => 3, 'unit' => '%', 'validators' => [ @@ -800,6 +805,7 @@ public function run(): void 'field' => 'TextInput', 'description' => 'Waist measurement in inches. Measure around the natural waistline', 'is_variant_attribute' => true, + 'is_translatable' => false, 'rank' => 1, 'unit' => 'inch', 'validators' => [ @@ -813,6 +819,7 @@ public function run(): void 'field' => 'TextInput', 'description' => 'Inseam length in inches, measured from crotch to hem', 'is_variant_attribute' => true, + 'is_translatable' => false, 'rank' => 2, 'unit' => 'inch', 'validators' => [ @@ -826,6 +833,7 @@ public function run(): void 'field' => 'Select', 'description' => 'Cut and fit style of the jeans, affecting how they shape to the body', 'is_variant_attribute' => true, + 'is_translatable' => true, 'rank' => 3, 'options' => [ ['label' => 'Skinny', 'value' => 'skinny'], @@ -846,6 +854,7 @@ public function run(): void 'field' => 'Select', 'description' => 'Standard dress size using international sizing system (XS to XL)', 'is_variant_attribute' => true, + 'is_translatable' => false, 'rank' => 1, 'options' => [ ['label' => 'Extra Small', 'value' => 'XS'], @@ -857,11 +866,11 @@ public function run(): void ], [ 'name' => 'Length', - 'description' => 'Length of the dress', 'type' => 'select', 'field' => 'Select', 'description' => 'Overall length of the dress, measured from shoulder to hem', 'is_variant_attribute' => false, + 'is_translatable' => true, 'rank' => 2, 'options' => [ ['label' => 'Mini', 'value' => 'mini'], @@ -881,6 +890,7 @@ public function run(): void 'field' => 'TextInput', 'description' => 'European shoe size. For half sizes, round up to the nearest whole number', 'is_variant_attribute' => true, + 'is_translatable' => false, 'rank' => 1, 'unit' => 'EU', 'validators' => [ @@ -895,6 +905,7 @@ public function run(): void 'field' => 'ColorPicker', 'description' => 'Primary color of the shoes. For multi-colored shoes, select the dominant color', 'is_variant_attribute' => true, + 'is_translatable' => false, 'rank' => 2, ], [ @@ -903,6 +914,7 @@ public function run(): void 'field' => 'Select', 'description' => 'Primary material used in the shoe construction', 'is_variant_attribute' => false, + 'is_translatable' => true, 'rank' => 3, 'options' => [ ['label' => 'Leather', 'value' => 'leather'], @@ -922,6 +934,7 @@ public function run(): void 'field' => 'Select', 'description' => 'General size category of the bag, based on carrying capacity and dimensions', 'is_variant_attribute' => false, + 'is_translatable' => false, 'rank' => 1, 'options' => [ ['label' => 'Small', 'value' => 'small'], @@ -935,6 +948,7 @@ public function run(): void 'field' => 'ColorPicker', 'description' => 'Main color of the bag. For multi-colored bags, choose the predominant color', 'is_variant_attribute' => true, + 'is_translatable' => false, 'rank' => 2, ], [ @@ -943,6 +957,7 @@ public function run(): void 'field' => 'Select', 'description' => 'Primary material used in the bag construction. Affects durability and care instructions', 'is_variant_attribute' => false, + 'is_translatable' => true, 'rank' => 3, 'options' => [ ['label' => 'Leather', 'value' => 'leather'], @@ -958,14 +973,33 @@ public function run(): void foreach ($productTypes as $productTypeData) { $attributes = $productTypeData['attributes']; unset($productTypeData['attributes']); - + $productType = \App\Models\ProductType::create($productTypeData); - + foreach ($attributes as $attributeData) { $productType->attributes()->create($attributeData); } } + // Create locales + DB::table('locales')->insert([ + [ + 'code' => 'en-US', + 'name' => 'English (US)', + 'default' => true, + ], + [ + 'code' => 'fr-FR', + 'name' => 'French', + 'default' => false, + ], + [ + 'code' => 'de-DE', + 'name' => 'German', + 'default' => false, + ], + ]); + // Get all variants and currencies $variants = SellerVariant::all(); $currencies = Currency::all(); @@ -999,5 +1033,140 @@ public function run(): void $price->save(); } } + + // Create Golden Products + $goldenProducts = [ + [ + 'product_type_id' => ProductType::where('name', 'Jeans')->first()->id, + 'translations' => [ + [ + 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, + 'name' => 'Classic Comfort Jeans', + 'description' => 'Premium denim jeans with a comfortable regular fit. Perfect for everyday wear.', + 'attributes' => [ + 'Style' => 'regular', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, + 'name' => 'Jean Confort Classique', + 'description' => 'Jean en denim premium avec une coupe régulière confortable. Parfait pour un usage quotidien.', + 'attributes' => [ + 'Style' => 'regular', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, + 'name' => 'Klassische Komfort-Jeans', + 'description' => 'Premium-Denim-Jeans mit bequemer regulärer Passform. Perfekt für den Alltag.', + 'attributes' => [ + 'Style' => 'regular', + ], + ], + ], + ], + [ + 'product_type_id' => ProductType::where('name', 'Dress')->first()->id, + 'translations' => [ + [ + 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, + 'name' => 'Elegant Evening Dress', + 'description' => 'A stunning midi dress perfect for special occasions and evening events.', + 'attributes' => [ + 'Length' => 'midi', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, + 'name' => 'Robe de Soirée Élégante', + 'description' => 'Une superbe robe midi parfaite pour les occasions spéciales et les soirées.', + 'attributes' => [ + 'Length' => 'midi', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, + 'name' => 'Elegantes Abendkleid', + 'description' => 'Ein atemberaubendes Midi-Kleid, perfekt für besondere Anlässe und Abendveranstaltungen.', + 'attributes' => [ + 'Length' => 'midi', + ], + ], + ], + ], + [ + 'product_type_id' => ProductType::where('name', 'Shoes')->first()->id, + 'translations' => [ + [ + 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, + 'name' => 'Classic Leather Oxford', + 'description' => 'Timeless leather oxford shoes crafted with premium materials and expert craftsmanship.', + 'attributes' => [ + 'Material' => 'leather', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, + 'name' => 'Oxford en Cuir Classique', + 'description' => 'Chaussures oxford intemporelles en cuir fabriquées avec des matériaux premium et un savoir-faire expert.', + 'attributes' => [ + 'Material' => 'leather', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, + 'name' => 'Klassischer Leder-Oxford', + 'description' => 'Zeitlose Leder-Oxford-Schuhe, gefertigt aus Premium-Materialien mit expertenhafter Handwerkskunst.', + 'attributes' => [ + 'Material' => 'leather', + ], + ], + ], + ], + [ + 'product_type_id' => ProductType::where('name', 'Bag')->first()->id, + 'translations' => [ + [ + 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, + 'name' => 'Premium Leather Tote', + 'description' => 'Spacious leather tote bag with premium finishes and durable construction.', + 'attributes' => [ + 'Size' => 'large', + 'Material' => 'leather', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, + 'name' => 'Cabas en Cuir Premium', + 'description' => 'Grand sac cabas en cuir avec finitions premium et construction durable.', + 'attributes' => [ + 'Size' => 'large', + 'Material' => 'leather', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, + 'name' => 'Premium Leder-Shopper', + 'description' => 'Geräumige Ledertasche mit Premium-Verarbeitung und langlebiger Konstruktion.', + 'attributes' => [ + 'Size' => 'large', + 'Material' => 'leather', + ], + ], + ], + ], + ]; + + foreach ($goldenProducts as $productData) { + $translations = $productData['translations']; + unset($productData['translations']); + + $goldenProduct = \App\Models\GoldenProduct::create($productData); + + foreach ($translations as $translationData) { + $translationData['product_type_id'] = $productData['product_type_id']; + $goldenProduct->translations()->create($translationData); + } + } } } diff --git a/draft.yaml b/draft.yaml index 2d74e03..fb16728 100644 --- a/draft.yaml +++ b/draft.yaml @@ -124,6 +124,7 @@ models: ProductTypeAttribute: name: string type: enum:text,boolean,number,select,url,color + is_translatable: boolean default:false field: enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker required: boolean default:false rank: integer default:0 @@ -135,10 +136,22 @@ models: product_type_id: id foreign GoldenProduct: + product_type_id: id foreign + relationships: + hasMany: GoldenProductLocalized:translation + + GoldenProductLocalized: name: string description: text nullable attributes: json nullable product_type_id: id foreign + locale_id: id foreign + golden_product_id: id foreign + + Locale: + code: string + name: string + default: boolean controllers: # ... diff --git a/specs.md b/specs.md index 862e889..5521f8c 100644 --- a/specs.md +++ b/specs.md @@ -27,6 +27,10 @@ Field type and Validators: | **CheckboxList** | Array, Required | | **KeyValue** | Array (with key-value format validation), Required | +TODO: +- attribute options must be translatable + + ## Product Type Mapping When a seller sets a seller-product to "active", then: - [ ] ... a golden product is created or selected (if EAN or other non-merchant specific article number matches). From 6c16fcf7e14bd213ad6113a07bc0d940aeba3b7e Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Tue, 3 Dec 2024 13:33:23 +0100 Subject: [PATCH 04/19] ... --- app/Filament/Owner/Resources/GoldenProductResource.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/Filament/Owner/Resources/GoldenProductResource.php b/app/Filament/Owner/Resources/GoldenProductResource.php index c70896e..4223f27 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource.php +++ b/app/Filament/Owner/Resources/GoldenProductResource.php @@ -45,6 +45,7 @@ public static function form(Form $form): Form return $form ->schema([ Forms\Components\Select::make('active_locale') + ->label('') ->options(function () { return Locale::query() ->orderBy('default', 'desc') @@ -95,7 +96,7 @@ public static function form(Form $form): Form $translation = $record->translations() ->where('locale_id', $defaultLocale->id) ->first(); - + $component->state($translation?->name); } }), @@ -109,7 +110,7 @@ public static function form(Form $form): Form $translation = $record->translations() ->where('locale_id', $defaultLocale->id) ->first(); - + $component->state($translation?->description); } }), @@ -230,7 +231,7 @@ protected static function getAttributeFields(?string $productTypeId): array protected function handleRecordCreation(array $data): Model { $localeId = $data['active_locale'] ?? Locale::where('default', true)->first()?->id; - + $record = new GoldenProduct([ 'product_type_id' => $data['product_type_id'], ]); @@ -250,7 +251,7 @@ protected function handleRecordCreation(array $data): Model protected function handleRecordUpdate(Model $record, array $data): Model { $localeId = $data['active_locale'] ?? Locale::where('default', true)->first()?->id; - + $record->update([ 'product_type_id' => $data['product_type_id'], ]); From 0151cbda8dad220af416beb51d9215aa929d7236 Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 10:40:47 +0100 Subject: [PATCH 05/19] ... --- README.md | 33 +++---- .../Owner/Resources/OrderResource.php | 96 +++++++++++++++++++ .../OrderResource/Pages/CreateOrder.php | 12 +++ .../OrderResource/Pages/EditOrder.php | 19 ++++ .../OrderResource/Pages/ListOrders.php | 19 ++++ app/Models/Customer.php | 20 ++++ app/Models/Order.php | 47 +++++++++ app/Models/OrderItem.php | 52 ++++++++++ database/factories/OrderFactory.php | 33 +++++++ database/factories/OrderItemFactory.php | 34 +++++++ ...2024_12_03_124252_create_sellers_table.php | 29 ++++++ ...12_03_124253_create_partnerships_table.php | 36 +++++++ ..._12_03_124254_create_seller_data_table.php | 52 ++++++++++ ...4_12_03_124255_create_categories_table.php | 35 +++++++ ...03_124256_create_seller_products_table.php | 44 +++++++++ ...257_create_seller_product_images_table.php | 35 +++++++ ...03_124258_create_seller_variants_table.php | 38 ++++++++ .../2024_12_03_124259_create_prices_table.php | 35 +++++++ .../2024_12_03_124300_create_stocks_table.php | 38 ++++++++ ...24_12_03_124301_create_locations_table.php | 35 +++++++ ...4_12_03_124302_create_currencies_table.php | 35 +++++++ ...024_12_03_124303_create_messages_table.php | 34 +++++++ ...2_03_124304_create_product_types_table.php | 32 +++++++ ...5_create_product_type_attributes_table.php | 43 +++++++++ ...03_124306_create_golden_products_table.php | 32 +++++++ ...create_golden_product_localizeds_table.php | 37 +++++++ ...2024_12_03_124308_create_locales_table.php | 34 +++++++ .../2024_12_03_124309_create_orders_table.php | 37 +++++++ ..._12_03_124310_create_order_items_table.php | 36 +++++++ ..._12_03_124311_create_seller_user_table.php | 31 ++++++ 30 files changed, 1074 insertions(+), 19 deletions(-) create mode 100644 app/Filament/Owner/Resources/OrderResource.php create mode 100644 app/Filament/Owner/Resources/OrderResource/Pages/CreateOrder.php create mode 100644 app/Filament/Owner/Resources/OrderResource/Pages/EditOrder.php create mode 100644 app/Filament/Owner/Resources/OrderResource/Pages/ListOrders.php create mode 100644 app/Models/Customer.php create mode 100644 app/Models/Order.php create mode 100644 app/Models/OrderItem.php create mode 100644 database/factories/OrderFactory.php create mode 100644 database/factories/OrderItemFactory.php create mode 100644 database/migrations/2024_12_03_124252_create_sellers_table.php create mode 100644 database/migrations/2024_12_03_124253_create_partnerships_table.php create mode 100644 database/migrations/2024_12_03_124254_create_seller_data_table.php create mode 100644 database/migrations/2024_12_03_124255_create_categories_table.php create mode 100644 database/migrations/2024_12_03_124256_create_seller_products_table.php create mode 100644 database/migrations/2024_12_03_124257_create_seller_product_images_table.php create mode 100644 database/migrations/2024_12_03_124258_create_seller_variants_table.php create mode 100644 database/migrations/2024_12_03_124259_create_prices_table.php create mode 100644 database/migrations/2024_12_03_124300_create_stocks_table.php create mode 100644 database/migrations/2024_12_03_124301_create_locations_table.php create mode 100644 database/migrations/2024_12_03_124302_create_currencies_table.php create mode 100644 database/migrations/2024_12_03_124303_create_messages_table.php create mode 100644 database/migrations/2024_12_03_124304_create_product_types_table.php create mode 100644 database/migrations/2024_12_03_124305_create_product_type_attributes_table.php create mode 100644 database/migrations/2024_12_03_124306_create_golden_products_table.php create mode 100644 database/migrations/2024_12_03_124307_create_golden_product_localizeds_table.php create mode 100644 database/migrations/2024_12_03_124308_create_locales_table.php create mode 100644 database/migrations/2024_12_03_124309_create_orders_table.php create mode 100644 database/migrations/2024_12_03_124310_create_order_items_table.php create mode 100644 database/migrations/2024_12_03_124311_create_seller_user_table.php diff --git a/README.md b/README.md index 12242d7..dd3ded0 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,29 @@ -## About the project +## About the Project -This repository represents a new open source Seller Center. A Seller Center is a SaaS application that runs side-by-side to the online shop and is integrated via API. It allows sellers to manage their products, stocks, and prices, while also processing orders from the shop. If you’ve ever sold something on platforms like Amazon or eBay, you’re already familiar with the concept. +This repository hosts an Open-Source Seller Center (OSSC) for shop owners, who want to turn their existing online shop into a marketplace. -Despite its importance for every marketplace, most existing e-commerce platforms lack this functionality, leaving shop operators to rely on expensive commercial solutions like Mirakl, Marketplacer or Arcadier. +A Seller Center is an application that runs side-by-side to the online shop and is integrated via API. It enables sellers to manage products, inventory, and pricing while processing orders from integrated online shops. If you've sold on platforms like Amazon or eBay, you're already familiar with the concept. -Surprisingly, there’s no strong open-source alternative available... +Despite being essential for marketplaces, most e-commerce platforms lack this functionality, forcing shop operators to rely on costly commercial solutions. Surprisingly, a robust open-source alternative has been missing from the market. -This project is built in public and will be free to use. I will regularly document my progress from the initial implementation to the release of the first version of the project. I aim to share insights, challenges, and solutions along the way, providing a transparent view of building an open-source Seller Center. Stay tuned as I transform this idea into a reality. +This project aims to fill that gap. Built in public and free to use, it will be developed transparently from initial implementation to the first release. I'll regularly document progress, sharing insights, challenges, and solutions to provide a clear view of the development process. -Follow me me on LinkedIn to get updates: -- https://www.linkedin.com/in/fabian-wesner/ +Stay updated on the project: +- Follow me on LinkedIn: https://www.linkedin.com/in/fabian-wesner/ +- Read project articles: https://blog.ossc.tech/ +- Visit the project homepage: https://ossc.tech +- Documentation: https://docs.spryker.com/ +- Demo: https://www.ossc.tech/#demo -or find a list of all articles here: https://github.com/FabianWesner/seller-center/wiki +Join us as we transform this idea into a reality and create a valuable open-source solution for the e-commerce community. ## Install Guide This is a regular Laravel & FilamentPHP application. You can install it like any other Laravel application. Just clone the repository and run `composer run dev`. URLs -* Shop Operators: http://localhost:8000/operator/ (Use `operator@tecsteps.com` as username and password) -* Sellers: http://localhost:8000/seller/ (Use `seller@tecsteps.com` as username and password) - -## User Guide - -There is no fully blown documentation yet. The idea is pretty simple: - -* Shop operators can register and configure their shop (set categories, currencies, product-types, manage their sellers, etc.) -* Sellers can also register and apply for a shop. Then they can import their products, manage stocks, prices, etc. - -The Seller Center is a multi-tenant application. Operators and Sellers are tenants. Each tenant has its own data and set of users (with permissions at some point). +* Shop Operators: http://localhost:8000/operator/ (Use `owner@ossc.tech` as username and password) +* Sellers: http://localhost:8000/seller/ ## Imprint / Impressum diff --git a/app/Filament/Owner/Resources/OrderResource.php b/app/Filament/Owner/Resources/OrderResource.php new file mode 100644 index 0000000..ff64f1b --- /dev/null +++ b/app/Filament/Owner/Resources/OrderResource.php @@ -0,0 +1,96 @@ +schema([ + Forms\Components\TextInput::make('order_number') + ->required(), + Forms\Components\TextInput::make('status') + ->required(), + Forms\Components\TextInput::make('total_amount') + ->required() + ->numeric(), + Forms\Components\Select::make('seller_id') + ->relationship('seller', 'name') + ->required(), + Forms\Components\Textarea::make('shipping_address') + ->required() + ->columnSpanFull(), + Forms\Components\Textarea::make('billing_address') + ->required() + ->columnSpanFull(), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('order_number') + ->searchable(), + Tables\Columns\TextColumn::make('status') + ->searchable(), + Tables\Columns\TextColumn::make('total_amount') + ->numeric() + ->sortable(), + Tables\Columns\TextColumn::make('seller.name') + ->numeric() + ->sortable(), + Tables\Columns\TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->actions([ + Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListOrders::route('/'), + 'create' => Pages\CreateOrder::route('/create'), + 'edit' => Pages\EditOrder::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Owner/Resources/OrderResource/Pages/CreateOrder.php b/app/Filament/Owner/Resources/OrderResource/Pages/CreateOrder.php new file mode 100644 index 0000000..47beb5e --- /dev/null +++ b/app/Filament/Owner/Resources/OrderResource/Pages/CreateOrder.php @@ -0,0 +1,12 @@ +hasMany(Order::class); + } +} diff --git a/app/Models/Order.php b/app/Models/Order.php new file mode 100644 index 0000000..f40bd6d --- /dev/null +++ b/app/Models/Order.php @@ -0,0 +1,47 @@ + 'integer', + 'seller_id' => 'integer', + ]; + + public function seller(): BelongsTo + { + return $this->belongsTo(Seller::class); + } + + public function orderItems(): HasMany + { + return $this->hasMany(OrderItem::class); + } +} diff --git a/app/Models/OrderItem.php b/app/Models/OrderItem.php new file mode 100644 index 0000000..c4128c0 --- /dev/null +++ b/app/Models/OrderItem.php @@ -0,0 +1,52 @@ + 'integer', + 'order_id' => 'integer', + 'seller_product_id' => 'integer', + 'seller_variant_id' => 'integer', + ]; + + public function order(): BelongsTo + { + return $this->belongsTo(Order::class); + } + + public function sellerProduct(): BelongsTo + { + return $this->belongsTo(SellerProduct::class); + } + + public function sellerVariant(): BelongsTo + { + return $this->belongsTo(SellerVariant::class); + } +} diff --git a/database/factories/OrderFactory.php b/database/factories/OrderFactory.php new file mode 100644 index 0000000..34b1923 --- /dev/null +++ b/database/factories/OrderFactory.php @@ -0,0 +1,33 @@ + $this->faker->word(), + 'status' => $this->faker->randomElement(["pending","processing","shipped","delivered","cancelled"]), + 'total_amount' => $this->faker->numberBetween(-10000, 10000), + 'seller_id' => Seller::factory(), + 'shipping_address' => $this->faker->text(), + 'billing_address' => $this->faker->text(), + ]; + } +} diff --git a/database/factories/OrderItemFactory.php b/database/factories/OrderItemFactory.php new file mode 100644 index 0000000..e1b7fc6 --- /dev/null +++ b/database/factories/OrderItemFactory.php @@ -0,0 +1,34 @@ + Order::factory(), + 'seller_product_id' => SellerProduct::factory(), + 'seller_variant_id' => SellerVariant::factory(), + 'quantity' => $this->faker->numberBetween(-10000, 10000), + 'price' => $this->faker->numberBetween(-10000, 10000), + ]; + } +} diff --git a/database/migrations/2024_12_03_124252_create_sellers_table.php b/database/migrations/2024_12_03_124252_create_sellers_table.php new file mode 100644 index 0000000..b8628ef --- /dev/null +++ b/database/migrations/2024_12_03_124252_create_sellers_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('name'); + $table->boolean('hideProducts')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('sellers'); + } +}; diff --git a/database/migrations/2024_12_03_124253_create_partnerships_table.php b/database/migrations/2024_12_03_124253_create_partnerships_table.php new file mode 100644 index 0000000..0ee0a49 --- /dev/null +++ b/database/migrations/2024_12_03_124253_create_partnerships_table.php @@ -0,0 +1,36 @@ +id(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->enum('status', ["submitted","accepted","rejected","review"])->default('submitted'); + $table->text('rejection_reason')->nullable(); + $table->text('notes')->nullable(); + $table->boolean('select_all_products')->default(false); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('partnerships'); + } +}; diff --git a/database/migrations/2024_12_03_124254_create_seller_data_table.php b/database/migrations/2024_12_03_124254_create_seller_data_table.php new file mode 100644 index 0000000..d87cc30 --- /dev/null +++ b/database/migrations/2024_12_03_124254_create_seller_data_table.php @@ -0,0 +1,52 @@ +id(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->string('email')->nullable(); + $table->text('description')->nullable(); + $table->string('company_name')->nullable(); + $table->string('address_line1')->nullable(); + $table->string('address_line2')->nullable(); + $table->string('city')->nullable(); + $table->string('state')->nullable(); + $table->string('postal_code')->nullable(); + $table->string('country_code')->nullable(); + $table->string('phone')->nullable(); + $table->string('vat')->nullable(); + $table->string('tin')->nullable(); + $table->string('eori')->nullable(); + $table->string('iban')->nullable(); + $table->string('swift_bic')->nullable(); + $table->string('bank_name')->nullable(); + $table->string('account_holder_name')->nullable(); + $table->string('file1')->nullable(); + $table->string('file2')->nullable(); + $table->string('file3')->nullable(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_data'); + } +}; diff --git a/database/migrations/2024_12_03_124255_create_categories_table.php b/database/migrations/2024_12_03_124255_create_categories_table.php new file mode 100644 index 0000000..5aacc7b --- /dev/null +++ b/database/migrations/2024_12_03_124255_create_categories_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('name'); + $table->text('description')->nullable(); + $table->boolean('is_active')->nullable(); + $table->foreignId('parent_id')->nullable()->constrained('categories')->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('categories'); + } +}; diff --git a/database/migrations/2024_12_03_124256_create_seller_products_table.php b/database/migrations/2024_12_03_124256_create_seller_products_table.php new file mode 100644 index 0000000..1ddc912 --- /dev/null +++ b/database/migrations/2024_12_03_124256_create_seller_products_table.php @@ -0,0 +1,44 @@ +id(); + $table->string('name'); + $table->string('brand')->nullable(); + $table->string('sku')->nullable(); + $table->text('description')->nullable(); + $table->json('attributes')->nullable(); + $table->foreignId('category_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->enum('status', ["draft","active","delisted"])->default('draft'); + $table->boolean('selected')->default(false); + $table->string('ean')->nullable(); + $table->string('upc')->nullable(); + $table->string('gtin_14')->nullable(); + $table->string('gtin_8')->nullable(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_products'); + } +}; diff --git a/database/migrations/2024_12_03_124257_create_seller_product_images_table.php b/database/migrations/2024_12_03_124257_create_seller_product_images_table.php new file mode 100644 index 0000000..fc04f51 --- /dev/null +++ b/database/migrations/2024_12_03_124257_create_seller_product_images_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->string('image'); + $table->integer('number')->default(1); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_product_images'); + } +}; diff --git a/database/migrations/2024_12_03_124258_create_seller_variants_table.php b/database/migrations/2024_12_03_124258_create_seller_variants_table.php new file mode 100644 index 0000000..d33fbd7 --- /dev/null +++ b/database/migrations/2024_12_03_124258_create_seller_variants_table.php @@ -0,0 +1,38 @@ +id(); + $table->string('name'); + $table->string('sku')->nullable(); + $table->text('description')->nullable(); + $table->json('attributes')->nullable(); + $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->enum('status', ["draft","active","delisted"])->default('draft'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_variants'); + } +}; diff --git a/database/migrations/2024_12_03_124259_create_prices_table.php b/database/migrations/2024_12_03_124259_create_prices_table.php new file mode 100644 index 0000000..cf72b6a --- /dev/null +++ b/database/migrations/2024_12_03_124259_create_prices_table.php @@ -0,0 +1,35 @@ +id(); + $table->integer('amount'); + $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('currency_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('prices'); + } +}; diff --git a/database/migrations/2024_12_03_124300_create_stocks_table.php b/database/migrations/2024_12_03_124300_create_stocks_table.php new file mode 100644 index 0000000..17b09e8 --- /dev/null +++ b/database/migrations/2024_12_03_124300_create_stocks_table.php @@ -0,0 +1,38 @@ +id(); + $table->integer('quantity'); + $table->integer('reserved')->nullable(); + $table->integer('safety_stock')->nullable(); + $table->foreignId('seller_variant_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('location_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('stocks'); + } +}; diff --git a/database/migrations/2024_12_03_124301_create_locations_table.php b/database/migrations/2024_12_03_124301_create_locations_table.php new file mode 100644 index 0000000..c643177 --- /dev/null +++ b/database/migrations/2024_12_03_124301_create_locations_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('name'); + $table->string('address'); + $table->integer('default_delivery_days')->nullable(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('locations'); + } +}; diff --git a/database/migrations/2024_12_03_124302_create_currencies_table.php b/database/migrations/2024_12_03_124302_create_currencies_table.php new file mode 100644 index 0000000..10e1a36 --- /dev/null +++ b/database/migrations/2024_12_03_124302_create_currencies_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('code'); + $table->string('symbol'); + $table->string('name')->nullable(); + $table->boolean('is_default')->default(false); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('currencies'); + } +}; diff --git a/database/migrations/2024_12_03_124303_create_messages_table.php b/database/migrations/2024_12_03_124303_create_messages_table.php new file mode 100644 index 0000000..b37b7ca --- /dev/null +++ b/database/migrations/2024_12_03_124303_create_messages_table.php @@ -0,0 +1,34 @@ +id(); + $table->text('content'); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('message_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('messages'); + } +}; diff --git a/database/migrations/2024_12_03_124304_create_product_types_table.php b/database/migrations/2024_12_03_124304_create_product_types_table.php new file mode 100644 index 0000000..fdf1c25 --- /dev/null +++ b/database/migrations/2024_12_03_124304_create_product_types_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_types'); + } +}; diff --git a/database/migrations/2024_12_03_124305_create_product_type_attributes_table.php b/database/migrations/2024_12_03_124305_create_product_type_attributes_table.php new file mode 100644 index 0000000..19c0375 --- /dev/null +++ b/database/migrations/2024_12_03_124305_create_product_type_attributes_table.php @@ -0,0 +1,43 @@ +id(); + $table->string('name'); + $table->enum('type', ["text","boolean","number","select","url","color"]); + $table->boolean('is_translatable')->default(false); + $table->enum('field', ["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]); + $table->boolean('required')->default(false); + $table->integer('rank')->default(0); + $table->string('description')->nullable(); + $table->string('unit')->nullable(); + $table->boolean('is_variant_attribute')->default(false); + $table->json('options')->nullable(); + $table->json('validators')->nullable(); + $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_type_attributes'); + } +}; diff --git a/database/migrations/2024_12_03_124306_create_golden_products_table.php b/database/migrations/2024_12_03_124306_create_golden_products_table.php new file mode 100644 index 0000000..aa1610f --- /dev/null +++ b/database/migrations/2024_12_03_124306_create_golden_products_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_products'); + } +}; diff --git a/database/migrations/2024_12_03_124307_create_golden_product_localizeds_table.php b/database/migrations/2024_12_03_124307_create_golden_product_localizeds_table.php new file mode 100644 index 0000000..a9b0945 --- /dev/null +++ b/database/migrations/2024_12_03_124307_create_golden_product_localizeds_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->text('description')->nullable(); + $table->json('attributes')->nullable(); + $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('locale_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('golden_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_product_localizeds'); + } +}; diff --git a/database/migrations/2024_12_03_124308_create_locales_table.php b/database/migrations/2024_12_03_124308_create_locales_table.php new file mode 100644 index 0000000..272da91 --- /dev/null +++ b/database/migrations/2024_12_03_124308_create_locales_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('code'); + $table->string('name'); + $table->boolean('default'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('locales'); + } +}; diff --git a/database/migrations/2024_12_03_124309_create_orders_table.php b/database/migrations/2024_12_03_124309_create_orders_table.php new file mode 100644 index 0000000..b853df1 --- /dev/null +++ b/database/migrations/2024_12_03_124309_create_orders_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('order_number'); + $table->enum('status', ["pending","processing","shipped","delivered","cancelled"])->default('pending'); + $table->integer('total_amount'); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->text('shipping_address'); + $table->text('billing_address'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('orders'); + } +}; diff --git a/database/migrations/2024_12_03_124310_create_order_items_table.php b/database/migrations/2024_12_03_124310_create_order_items_table.php new file mode 100644 index 0000000..91ef70f --- /dev/null +++ b/database/migrations/2024_12_03_124310_create_order_items_table.php @@ -0,0 +1,36 @@ +id(); + $table->foreignId('order_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->integer('quantity'); + $table->integer('price'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('order_items'); + } +}; diff --git a/database/migrations/2024_12_03_124311_create_seller_user_table.php b/database/migrations/2024_12_03_124311_create_seller_user_table.php new file mode 100644 index 0000000..b124774 --- /dev/null +++ b/database/migrations/2024_12_03_124311_create_seller_user_table.php @@ -0,0 +1,31 @@ +foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_user'); + } +}; From da5d0a51e12c27b1bf458c29acde58ce633f43f6 Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 10:49:49 +0100 Subject: [PATCH 06/19] ... --- composer.json | 11 +- composer.lock | 841 ++++++++++++++------------- public/css/filament/filament/app.css | 2 +- public/css/filament/forms/forms.css | 2 +- 4 files changed, 433 insertions(+), 423 deletions(-) diff --git a/composer.json b/composer.json index 6ab9f2b..ee76014 100644 --- a/composer.json +++ b/composer.json @@ -2,16 +2,19 @@ "name": "laravel/laravel", "type": "project", "description": "The skeleton application for the Laravel framework.", - "keywords": ["laravel", "framework"], + "keywords": [ + "laravel", + "framework" + ], "license": "MIT", "require": { "php": "^8.2", "filament/filament": "^3.2", "laravel/framework": "^11.9", - "laravel/tinker": "^2.9" + "laravel/tinker": "^2.9", + "fakerphp/faker": "^1.23" }, "require-dev": { - "fakerphp/faker": "^1.23", "laravel-shift/blueprint": "^2.10", "laravel/pail": "^1.1", "laravel/pint": "^1.13", @@ -71,4 +74,4 @@ }, "minimum-stability": "stable", "prefer-stable": true -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 5c351a2..1fa15f8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "28dbca8447d5a58cb18d947175ebcd23", + "content-hash": "0f494d504df14401f597608ad22b3e41", "packages": [ { "name": "anourvalar/eloquent-serialize", - "version": "1.2.26", + "version": "1.2.27", "source": { "type": "git", "url": "https://github.com/AnourValar/eloquent-serialize.git", - "reference": "756c1232ff0d02321fd90f4fe3c221d6a7b8d697" + "reference": "f1c4fcd41a6db1467ed75bc295b62f582d6fd0fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/756c1232ff0d02321fd90f4fe3c221d6a7b8d697", - "reference": "756c1232ff0d02321fd90f4fe3c221d6a7b8d697", + "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/f1c4fcd41a6db1467ed75bc295b62f582d6fd0fe", + "reference": "f1c4fcd41a6db1467ed75bc295b62f582d6fd0fe", "shasum": "" }, "require": { @@ -68,22 +68,22 @@ ], "support": { "issues": "https://github.com/AnourValar/eloquent-serialize/issues", - "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.2.26" + "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.2.27" }, - "time": "2024-11-16T12:29:47+00:00" + "time": "2024-11-30T08:27:24+00:00" }, { "name": "blade-ui-kit/blade-heroicons", - "version": "2.4.0", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/blade-ui-kit/blade-heroicons.git", - "reference": "a7c377a4ef88cd54712e3e15cbed30446820da0b" + "reference": "4ed3ed08e9ac192d0d126b2f12711d6fb6576a48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/blade-ui-kit/blade-heroicons/zipball/a7c377a4ef88cd54712e3e15cbed30446820da0b", - "reference": "a7c377a4ef88cd54712e3e15cbed30446820da0b", + "url": "https://api.github.com/repos/blade-ui-kit/blade-heroicons/zipball/4ed3ed08e9ac192d0d126b2f12711d6fb6576a48", + "reference": "4ed3ed08e9ac192d0d126b2f12711d6fb6576a48", "shasum": "" }, "require": { @@ -127,7 +127,7 @@ ], "support": { "issues": "https://github.com/blade-ui-kit/blade-heroicons/issues", - "source": "https://github.com/blade-ui-kit/blade-heroicons/tree/2.4.0" + "source": "https://github.com/blade-ui-kit/blade-heroicons/tree/2.5.0" }, "funding": [ { @@ -139,7 +139,7 @@ "type": "paypal" } ], - "time": "2024-07-16T07:00:01+00:00" + "time": "2024-11-18T19:59:07+00:00" }, { "name": "blade-ui-kit/blade-icons", @@ -986,18 +986,81 @@ ], "time": "2023-10-06T06:47:41+00:00" }, + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, { "name": "filament/actions", - "version": "v3.2.124", + "version": "v3.2.127", "source": { "type": "git", "url": "https://github.com/filamentphp/actions.git", - "reference": "631b38a36f5209a3884182acee60a0db682c6d24" + "reference": "f325e315c365cfcea5c9da96662ddea37e3663fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/631b38a36f5209a3884182acee60a0db682c6d24", - "reference": "631b38a36f5209a3884182acee60a0db682c6d24", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/f325e315c365cfcea5c9da96662ddea37e3663fc", + "reference": "f325e315c365cfcea5c9da96662ddea37e3663fc", "shasum": "" }, "require": { @@ -1037,20 +1100,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-11-13T16:35:31+00:00" + "time": "2024-11-29T09:30:57+00:00" }, { "name": "filament/filament", - "version": "v3.2.124", + "version": "v3.2.127", "source": { "type": "git", "url": "https://github.com/filamentphp/panels.git", - "reference": "3f170b1c57033ad8e9e6bd71f3dc3f0665bf3ae9" + "reference": "4aea767e8c872842b624fe47affe078433111259" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/3f170b1c57033ad8e9e6bd71f3dc3f0665bf3ae9", - "reference": "3f170b1c57033ad8e9e6bd71f3dc3f0665bf3ae9", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/4aea767e8c872842b624fe47affe078433111259", + "reference": "4aea767e8c872842b624fe47affe078433111259", "shasum": "" }, "require": { @@ -1102,20 +1165,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-11-13T16:35:35+00:00" + "time": "2024-11-29T09:30:58+00:00" }, { "name": "filament/forms", - "version": "v3.2.124", + "version": "v3.2.127", "source": { "type": "git", "url": "https://github.com/filamentphp/forms.git", - "reference": "c73351c086036bd8de24e8671fd97018942d6d61" + "reference": "c78071f1aabb63a0d9bf74268005d3294b61dc2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/c73351c086036bd8de24e8671fd97018942d6d61", - "reference": "c73351c086036bd8de24e8671fd97018942d6d61", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/c78071f1aabb63a0d9bf74268005d3294b61dc2a", + "reference": "c78071f1aabb63a0d9bf74268005d3294b61dc2a", "shasum": "" }, "require": { @@ -1158,20 +1221,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-11-13T16:35:31+00:00" + "time": "2024-11-29T09:30:53+00:00" }, { "name": "filament/infolists", - "version": "v3.2.124", + "version": "v3.2.127", "source": { "type": "git", "url": "https://github.com/filamentphp/infolists.git", - "reference": "7946035f47746e69ff9d98bfed04b0248000ee2e" + "reference": "e655ac3900ab2109022aa0243cfb4126729ef431" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/infolists/zipball/7946035f47746e69ff9d98bfed04b0248000ee2e", - "reference": "7946035f47746e69ff9d98bfed04b0248000ee2e", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/e655ac3900ab2109022aa0243cfb4126729ef431", + "reference": "e655ac3900ab2109022aa0243cfb4126729ef431", "shasum": "" }, "require": { @@ -1209,11 +1272,11 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-11-13T16:35:31+00:00" + "time": "2024-11-29T09:30:56+00:00" }, { "name": "filament/notifications", - "version": "v3.2.124", + "version": "v3.2.127", "source": { "type": "git", "url": "https://github.com/filamentphp/notifications.git", @@ -1265,27 +1328,27 @@ }, { "name": "filament/support", - "version": "v3.2.124", + "version": "v3.2.127", "source": { "type": "git", "url": "https://github.com/filamentphp/support.git", - "reference": "13b1e485d3bc993950c9e61a3f6a8cb05efd2b96" + "reference": "a720fb2508a1d84a9b35aedc9991d4b53d18fea6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/13b1e485d3bc993950c9e61a3f6a8cb05efd2b96", - "reference": "13b1e485d3bc993950c9e61a3f6a8cb05efd2b96", + "url": "https://api.github.com/repos/filamentphp/support/zipball/a720fb2508a1d84a9b35aedc9991d4b53d18fea6", + "reference": "a720fb2508a1d84a9b35aedc9991d4b53d18fea6", "shasum": "" }, "require": { - "blade-ui-kit/blade-heroicons": "^2.2.1", + "blade-ui-kit/blade-heroicons": "^2.5", "doctrine/dbal": "^3.2|^4.0", "ext-intl": "*", "illuminate/contracts": "^10.45|^11.0", "illuminate/support": "^10.45|^11.0", "illuminate/view": "^10.45|^11.0", "kirschbaum-development/eloquent-power-joins": "^3.0|^4.0", - "livewire/livewire": "^3.4.10", + "livewire/livewire": "3.5.12", "php": "^8.1", "ryangjchandler/blade-capture-directive": "^0.2|^0.3|^1.0", "spatie/color": "^1.5", @@ -1320,20 +1383,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-11-13T16:35:51+00:00" + "time": "2024-11-29T09:31:13+00:00" }, { "name": "filament/tables", - "version": "v3.2.124", + "version": "v3.2.127", "source": { "type": "git", "url": "https://github.com/filamentphp/tables.git", - "reference": "5f1b04952080e71f3f72bae3801f2757619722e7" + "reference": "c287a68e084c96c3f2991eaddf1d6b5159af5147" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/5f1b04952080e71f3f72bae3801f2757619722e7", - "reference": "5f1b04952080e71f3f72bae3801f2757619722e7", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/c287a68e084c96c3f2991eaddf1d6b5159af5147", + "reference": "c287a68e084c96c3f2991eaddf1d6b5159af5147", "shasum": "" }, "require": { @@ -1372,20 +1435,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-11-13T16:35:47+00:00" + "time": "2024-11-30T09:21:26+00:00" }, { "name": "filament/widgets", - "version": "v3.2.124", + "version": "v3.2.127", "source": { "type": "git", "url": "https://github.com/filamentphp/widgets.git", - "reference": "59a907af93c9027180e2bac5879f35b5fb11c96f" + "reference": "6de1c84d71168fd1c6a5b1ae1e1b4ec5ee4b6f55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/widgets/zipball/59a907af93c9027180e2bac5879f35b5fb11c96f", - "reference": "59a907af93c9027180e2bac5879f35b5fb11c96f", + "url": "https://api.github.com/repos/filamentphp/widgets/zipball/6de1c84d71168fd1c6a5b1ae1e1b4ec5ee4b6f55", + "reference": "6de1c84d71168fd1c6a5b1ae1e1b4ec5ee4b6f55", "shasum": "" }, "require": { @@ -1416,7 +1479,7 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-11-13T16:35:48+00:00" + "time": "2024-11-27T16:52:29+00:00" }, { "name": "fruitcake/php-cors", @@ -1964,16 +2027,16 @@ }, { "name": "kirschbaum-development/eloquent-power-joins", - "version": "4.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/kirschbaum-development/eloquent-power-joins.git", - "reference": "c6c42a52c5a097cc11761e72782b2d0215692caf" + "reference": "3c1af9b86b02f1e39219849c1d2fee7cf77e8638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/c6c42a52c5a097cc11761e72782b2d0215692caf", - "reference": "c6c42a52c5a097cc11761e72782b2d0215692caf", + "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/3c1af9b86b02f1e39219849c1d2fee7cf77e8638", + "reference": "3c1af9b86b02f1e39219849c1d2fee7cf77e8638", "shasum": "" }, "require": { @@ -2021,29 +2084,29 @@ ], "support": { "issues": "https://github.com/kirschbaum-development/eloquent-power-joins/issues", - "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.0.0" + "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.0.1" }, - "time": "2024-10-06T12:28:14+00:00" + "time": "2024-11-26T13:22:08+00:00" }, { "name": "laravel/framework", - "version": "v11.32.0", + "version": "v11.34.2", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "bc2aad63f83ee5089be7b21cf29d645ccf31e927" + "reference": "865da6d73dd353f07a7bcbd778c55966a620121f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/bc2aad63f83ee5089be7b21cf29d645ccf31e927", - "reference": "bc2aad63f83ee5089be7b21cf29d645ccf31e927", + "url": "https://api.github.com/repos/laravel/framework/zipball/865da6d73dd353f07a7bcbd778c55966a620121f", + "reference": "865da6d73dd353f07a7bcbd778c55966a620121f", "shasum": "" }, "require": { "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", - "dragonmantank/cron-expression": "^3.3.2", + "dragonmantank/cron-expression": "^3.4", "egulias/email-validator": "^3.2.1|^4.0", "ext-ctype": "*", "ext-filter": "*", @@ -2053,35 +2116,36 @@ "ext-session": "*", "ext-tokenizer": "*", "fruitcake/php-cors": "^1.3", - "guzzlehttp/guzzle": "^7.8", + "guzzlehttp/guzzle": "^7.8.2", "guzzlehttp/uri-template": "^1.0", "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", - "laravel/serializable-closure": "^1.3", + "laravel/serializable-closure": "^1.3|^2.0", "league/commonmark": "^2.2.1", - "league/flysystem": "^3.8.0", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.72.2|^3.0", + "nesbot/carbon": "^2.72.2|^3.4", "nunomaduro/termwind": "^2.0", "php": "^8.2", "psr/container": "^1.1.1|^2.0.1", "psr/log": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "ramsey/uuid": "^4.7", - "symfony/console": "^7.0", - "symfony/error-handler": "^7.0", - "symfony/finder": "^7.0", - "symfony/http-foundation": "^7.0", - "symfony/http-kernel": "^7.0", - "symfony/mailer": "^7.0", - "symfony/mime": "^7.0", - "symfony/polyfill-php83": "^1.28", - "symfony/process": "^7.0", - "symfony/routing": "^7.0", - "symfony/uid": "^7.0", - "symfony/var-dumper": "^7.0", + "symfony/console": "^7.0.3", + "symfony/error-handler": "^7.0.3", + "symfony/finder": "^7.0.3", + "symfony/http-foundation": "^7.0.3", + "symfony/http-kernel": "^7.0.3", + "symfony/mailer": "^7.0.3", + "symfony/mime": "^7.0.3", + "symfony/polyfill-php83": "^1.31", + "symfony/process": "^7.0.3", + "symfony/routing": "^7.0.3", + "symfony/uid": "^7.0.3", + "symfony/var-dumper": "^7.0.3", "tijsverkoyen/css-to-inline-styles": "^2.2.5", - "vlucas/phpdotenv": "^5.4.1", - "voku/portable-ascii": "^2.0" + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" }, "conflict": { "mockery/mockery": "1.6.8", @@ -2131,29 +2195,32 @@ }, "require-dev": { "ably/ably-php": "^1.0", - "aws/aws-sdk-php": "^3.235.5", + "aws/aws-sdk-php": "^3.322.9", "ext-gmp": "*", - "fakerphp/faker": "^1.23", - "league/flysystem-aws-s3-v3": "^3.0", - "league/flysystem-ftp": "^3.0", - "league/flysystem-path-prefixing": "^3.3", - "league/flysystem-read-only": "^3.3", - "league/flysystem-sftp-v3": "^3.0", - "mockery/mockery": "^1.6", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", "nyholm/psr7": "^1.2", - "orchestra/testbench-core": "^9.5", - "pda/pheanstalk": "^5.0", + "orchestra/testbench-core": "^9.6", + "pda/pheanstalk": "^5.0.6", "phpstan/phpstan": "^1.11.5", - "phpunit/phpunit": "^10.5|^11.0", - "predis/predis": "^2.0.2", + "phpunit/phpunit": "^10.5.35|^11.3.6", + "predis/predis": "^2.3", "resend/resend-php": "^0.10.0", - "symfony/cache": "^7.0", - "symfony/http-client": "^7.0", - "symfony/psr-http-message-bridge": "^7.0" + "symfony/cache": "^7.0.3", + "symfony/http-client": "^7.0.3", + "symfony/psr-http-message-bridge": "^7.0.3", + "symfony/translation": "^7.0.3" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", - "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", "ext-apcu": "Required to use the APC cache driver.", "ext-fileinfo": "Required to use the Filesystem class.", @@ -2167,16 +2234,16 @@ "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", "laravel/tinker": "Required to use the tinker console command (^2.0).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", - "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", - "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", - "league/flysystem-read-only": "Required to use read-only disks (^3.3)", - "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", "mockery/mockery": "Required to use mocking (^1.6).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", - "predis/predis": "Required to use the predis connector (^2.0.2).", + "predis/predis": "Required to use the predis connector (^2.3).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", @@ -2232,7 +2299,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-11-15T17:04:33+00:00" + "time": "2024-11-27T15:43:57+00:00" }, { "name": "laravel/prompts", @@ -2295,32 +2362,32 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.3.6", + "version": "v2.0.0", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f865a58ea3a0107c336b7045104c75243fa59d96" + "reference": "0d8d3d8086984996df86596a86dea60398093a81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f865a58ea3a0107c336b7045104c75243fa59d96", - "reference": "f865a58ea3a0107c336b7045104c75243fa59d96", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/0d8d3d8086984996df86596a86dea60398093a81", + "reference": "0d8d3d8086984996df86596a86dea60398093a81", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "php": "^8.1" }, "require-dev": { - "illuminate/support": "^8.0|^9.0|^10.0|^11.0", - "nesbot/carbon": "^2.61|^3.0", - "pestphp/pest": "^1.21.3", - "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" + "illuminate/support": "^10.0|^11.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -2352,7 +2419,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2024-11-11T17:06:04+00:00" + "time": "2024-11-19T01:38:44+00:00" }, { "name": "laravel/tinker", @@ -3094,12 +3161,12 @@ "type": "library", "extra": { "laravel": { - "providers": [ - "Livewire\\LivewireServiceProvider" - ], "aliases": { "Livewire": "Livewire\\Livewire" - } + }, + "providers": [ + "Livewire\\LivewireServiceProvider" + ] } }, "autoload": { @@ -3617,31 +3684,31 @@ }, { "name": "nunomaduro/termwind", - "version": "v2.2.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "42c84e4e8090766bbd6445d06cd6e57650626ea3" + "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/42c84e4e8090766bbd6445d06cd6e57650626ea3", - "reference": "42c84e4e8090766bbd6445d06cd6e57650626ea3", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda", + "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^8.2", - "symfony/console": "^7.1.5" + "symfony/console": "^7.1.8" }, "require-dev": { - "illuminate/console": "^11.28.0", - "laravel/pint": "^1.18.1", + "illuminate/console": "^11.33.2", + "laravel/pint": "^1.18.2", "mockery/mockery": "^1.6.12", "pestphp/pest": "^2.36.0", - "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan": "^1.12.11", "phpstan/phpstan-strict-rules": "^1.6.1", - "symfony/var-dumper": "^7.1.5", + "symfony/var-dumper": "^7.1.8", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -3684,7 +3751,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.2.0" + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0" }, "funding": [ { @@ -3700,20 +3767,20 @@ "type": "github" } ], - "time": "2024-10-15T16:15:16+00:00" + "time": "2024-11-21T10:39:51+00:00" }, { "name": "openspout/openspout", - "version": "v4.26.0", + "version": "v4.28.0", "source": { "type": "git", "url": "https://github.com/openspout/openspout.git", - "reference": "a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50" + "reference": "3e9ef74f13ba5e887e4afc7a4e0110e63559e902" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/openspout/openspout/zipball/a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50", - "reference": "a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50", + "url": "https://api.github.com/repos/openspout/openspout/zipball/3e9ef74f13ba5e887e4afc7a4e0110e63559e902", + "reference": "3e9ef74f13ba5e887e4afc7a4e0110e63559e902", "shasum": "" }, "require": { @@ -3727,13 +3794,13 @@ }, "require-dev": { "ext-zlib": "*", - "friendsofphp/php-cs-fixer": "^3.64.0", - "infection/infection": "^0.29.6", + "friendsofphp/php-cs-fixer": "^3.65.0", + "infection/infection": "^0.29.8", "phpbench/phpbench": "^1.3.1", - "phpstan/phpstan": "^1.12.4", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.1", - "phpunit/phpunit": "^11.3.6" + "phpstan/phpstan": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.1", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^11.4.4" }, "suggest": { "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", @@ -3781,7 +3848,7 @@ ], "support": { "issues": "https://github.com/openspout/openspout/issues", - "source": "https://github.com/openspout/openspout/tree/v4.26.0" + "source": "https://github.com/openspout/openspout/tree/v4.28.0" }, "funding": [ { @@ -3793,7 +3860,7 @@ "type": "github" } ], - "time": "2024-09-24T14:04:43+00:00" + "time": "2024-11-29T09:45:53+00:00" }, { "name": "phpoption/phpoption", @@ -4333,16 +4400,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.4", + "version": "v0.12.5", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" + "reference": "36a03ff27986682c22985e56aabaf840dd173cb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", - "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/36a03ff27986682c22985e56aabaf840dd173cb5", + "reference": "36a03ff27986682c22985e56aabaf840dd173cb5", "shasum": "" }, "require": { @@ -4369,12 +4436,12 @@ ], "type": "library", "extra": { - "branch-alias": { - "dev-main": "0.12.x-dev" - }, "bamarni-bin": { "bin-links": false, "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" } }, "autoload": { @@ -4406,9 +4473,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.5" }, - "time": "2024-06-10T01:18:23+00:00" + "time": "2024-11-29T06:14:30+00:00" }, { "name": "ralouphie/getallheaders", @@ -4669,12 +4736,12 @@ "type": "library", "extra": { "laravel": { - "providers": [ - "RyanChandler\\BladeCaptureDirective\\BladeCaptureDirectiveServiceProvider" - ], "aliases": { "BladeCaptureDirective": "RyanChandler\\BladeCaptureDirective\\Facades\\BladeCaptureDirective" - } + }, + "providers": [ + "RyanChandler\\BladeCaptureDirective\\BladeCaptureDirectiveServiceProvider" + ] } }, "autoload": { @@ -4715,16 +4782,16 @@ }, { "name": "spatie/color", - "version": "1.6.0", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/spatie/color.git", - "reference": "02ce48c480f86d65702188f738f4e8ccad1b999a" + "reference": "4c540ffbef68a3df3d209718ae06deaab081e708" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/color/zipball/02ce48c480f86d65702188f738f4e8ccad1b999a", - "reference": "02ce48c480f86d65702188f738f4e8ccad1b999a", + "url": "https://api.github.com/repos/spatie/color/zipball/4c540ffbef68a3df3d209718ae06deaab081e708", + "reference": "4c540ffbef68a3df3d209718ae06deaab081e708", "shasum": "" }, "require": { @@ -4762,7 +4829,7 @@ ], "support": { "issues": "https://github.com/spatie/color/issues", - "source": "https://github.com/spatie/color/tree/1.6.0" + "source": "https://github.com/spatie/color/tree/1.6.1" }, "funding": [ { @@ -4770,7 +4837,7 @@ "type": "github" } ], - "time": "2024-09-20T14:00:15+00:00" + "time": "2024-11-18T15:00:47+00:00" }, { "name": "spatie/invade", @@ -4833,16 +4900,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.16.5", + "version": "1.16.6", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2" + "reference": "1f26942dc1e5c49eacfced34fdbc29ed234bd7b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/c7413972cf22ffdff97b68499c22baa04eddb6a2", - "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/1f26942dc1e5c49eacfced34fdbc29ed234bd7b3", + "reference": "1f26942dc1e5c49eacfced34fdbc29ed234bd7b3", "shasum": "" }, "require": { @@ -4881,7 +4948,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.5" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.6" }, "funding": [ { @@ -4889,20 +4956,20 @@ "type": "github" } ], - "time": "2024-08-27T18:56:10+00:00" + "time": "2024-11-18T15:02:02+00:00" }, { "name": "symfony/clock", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "97bebc53548684c17ed696bc8af016880f0f098d" + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/97bebc53548684c17ed696bc8af016880f0f098d", - "reference": "97bebc53548684c17ed696bc8af016880f0f098d", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", "shasum": "" }, "require": { @@ -4947,7 +5014,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.1.6" + "source": "https://github.com/symfony/clock/tree/v7.2.0" }, "funding": [ { @@ -4963,20 +5030,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/console", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5" + "reference": "23c8aae6d764e2bae02d2a99f7532a7f6ed619cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ff04e5b5ba043d2badfb308197b9e6b42883fcd5", - "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5", + "url": "https://api.github.com/repos/symfony/console/zipball/23c8aae6d764e2bae02d2a99f7532a7f6ed619cf", + "reference": "23c8aae6d764e2bae02d2a99f7532a7f6ed619cf", "shasum": "" }, "require": { @@ -5040,7 +5107,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.8" + "source": "https://github.com/symfony/console/tree/v7.2.0" }, "funding": [ { @@ -5056,20 +5123,20 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:23:19+00:00" + "time": "2024-11-06T14:24:19+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", "shasum": "" }, "require": { @@ -5105,7 +5172,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.6" + "source": "https://github.com/symfony/css-selector/tree/v7.2.0" }, "funding": [ { @@ -5121,20 +5188,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { @@ -5172,7 +5239,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -5188,20 +5255,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/error-handler", - "version": "v7.1.7", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "010e44661f4c6babaf8c4862fe68c24a53903342" + "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/010e44661f4c6babaf8c4862fe68c24a53903342", - "reference": "010e44661f4c6babaf8c4862fe68c24a53903342", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/672b3dd1ef8b87119b446d67c58c106c43f965fe", + "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe", "shasum": "" }, "require": { @@ -5247,7 +5314,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.1.7" + "source": "https://github.com/symfony/error-handler/tree/v7.2.0" }, "funding": [ { @@ -5263,20 +5330,20 @@ "type": "tidelift" } ], - "time": "2024-11-05T15:34:55+00:00" + "time": "2024-11-05T15:35:02+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "87254c78dd50721cfd015b62277a8281c5589702" + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", - "reference": "87254c78dd50721cfd015b62277a8281c5589702", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", "shasum": "" }, "require": { @@ -5327,7 +5394,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" }, "funding": [ { @@ -5343,20 +5410,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { @@ -5403,7 +5470,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { @@ -5419,20 +5486,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/finder", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8" + "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8", - "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8", + "url": "https://api.github.com/repos/symfony/finder/zipball/6de263e5868b9a137602dd1e33e4d48bfae99c49", + "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49", "shasum": "" }, "require": { @@ -5467,7 +5534,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.6" + "source": "https://github.com/symfony/finder/tree/v7.2.0" }, "funding": [ { @@ -5483,20 +5550,20 @@ "type": "tidelift" } ], - "time": "2024-10-01T08:31:23+00:00" + "time": "2024-10-23T06:56:12+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "a25620fc6407e14331f3c0c5668eb4f35c392d4a" + "reference": "1d23de45af5e8508441ff5f82bb493e83cdcbba4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/a25620fc6407e14331f3c0c5668eb4f35c392d4a", - "reference": "a25620fc6407e14331f3c0c5668eb4f35c392d4a", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/1d23de45af5e8508441ff5f82bb493e83cdcbba4", + "reference": "1d23de45af5e8508441ff5f82bb493e83cdcbba4", "shasum": "" }, "require": { @@ -5536,7 +5603,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v7.1.6" + "source": "https://github.com/symfony/html-sanitizer/tree/v7.2.0" }, "funding": [ { @@ -5552,24 +5619,25 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112" + "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f4419ec69ccfc3f725a4de7c20e4e57626d10112", - "reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e88a66c3997859532bc2ddd6dd8f35aba2711744", + "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, @@ -5613,7 +5681,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.8" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.0" }, "funding": [ { @@ -5629,20 +5697,20 @@ "type": "tidelift" } ], - "time": "2024-11-09T09:16:45+00:00" + "time": "2024-11-13T18:58:46+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e" + "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/33fef24e3dc79d6d30bf4936531f2f4bd2ca189e", - "reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d", + "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d", "shasum": "" }, "require": { @@ -5671,7 +5739,7 @@ "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", "symfony/var-dumper": "<6.4", - "twig/twig": "<3.0.4" + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" @@ -5699,7 +5767,7 @@ "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", "symfony/var-exporter": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "type": "library", "autoload": { @@ -5727,7 +5795,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.8" + "source": "https://github.com/symfony/http-kernel/tree/v7.2.0" }, "funding": [ { @@ -5743,20 +5811,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T14:25:32+00:00" + "time": "2024-11-29T08:42:40+00:00" }, { "name": "symfony/mailer", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd" + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/69c9948451fb3a6a4d47dc8261d1794734e76cdd", - "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc", + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc", "shasum": "" }, "require": { @@ -5765,7 +5833,7 @@ "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", + "symfony/mime": "^7.2", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -5807,7 +5875,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.6" + "source": "https://github.com/symfony/mailer/tree/v7.2.0" }, "funding": [ { @@ -5823,20 +5891,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-11-25T15:21:05+00:00" }, { "name": "symfony/mime", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "caa1e521edb2650b8470918dfe51708c237f0598" + "reference": "cc84a4b81f62158c3846ac7ff10f696aae2b524d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/caa1e521edb2650b8470918dfe51708c237f0598", - "reference": "caa1e521edb2650b8470918dfe51708c237f0598", + "url": "https://api.github.com/repos/symfony/mime/zipball/cc84a4b81f62158c3846ac7ff10f696aae2b524d", + "reference": "cc84a4b81f62158c3846ac7ff10f696aae2b524d", "shasum": "" }, "require": { @@ -5891,7 +5959,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.6" + "source": "https://github.com/symfony/mime/tree/v7.2.0" }, "funding": [ { @@ -5907,7 +5975,7 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2024-11-23T09:19:39+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6547,16 +6615,16 @@ }, { "name": "symfony/process", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892" + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892", - "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892", + "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", "shasum": "" }, "require": { @@ -6588,7 +6656,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.8" + "source": "https://github.com/symfony/process/tree/v7.2.0" }, "funding": [ { @@ -6604,20 +6672,20 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:23:19+00:00" + "time": "2024-11-06T14:24:19+00:00" }, { "name": "symfony/routing", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a" + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/66a2c469f6c22d08603235c46a20007c0701ea0a", - "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a", + "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e", + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e", "shasum": "" }, "require": { @@ -6669,7 +6737,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.6" + "source": "https://github.com/symfony/routing/tree/v7.2.0" }, "funding": [ { @@ -6685,20 +6753,20 @@ "type": "tidelift" } ], - "time": "2024-10-01T08:31:23+00:00" + "time": "2024-11-25T11:08:51+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { @@ -6752,7 +6820,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -6768,20 +6836,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/string", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281" + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/591ebd41565f356fcd8b090fe64dbb5878f50281", - "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", "shasum": "" }, "require": { @@ -6839,7 +6907,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.8" + "source": "https://github.com/symfony/string/tree/v7.2.0" }, "funding": [ { @@ -6855,24 +6923,25 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:21+00:00" + "time": "2024-11-13T13:31:26+00:00" }, { "name": "symfony/translation", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f" + "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/b9f72ab14efdb6b772f85041fa12f820dee8d55f", - "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f", + "url": "https://api.github.com/repos/symfony/translation/zipball/dc89e16b44048ceecc879054e5b7f38326ab6cc5", + "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, @@ -6933,7 +7002,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.6" + "source": "https://github.com/symfony/translation/tree/v7.2.0" }, "funding": [ { @@ -6949,20 +7018,20 @@ "type": "tidelift" } ], - "time": "2024-09-28T12:35:13+00:00" + "time": "2024-11-12T20:47:56+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { @@ -7011,7 +7080,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { @@ -7027,20 +7096,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/uid", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "65befb3bb2d503bbffbd08c815aa38b472999917" + "reference": "2d294d0c48df244c71c105a169d0190bfb080426" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/65befb3bb2d503bbffbd08c815aa38b472999917", - "reference": "65befb3bb2d503bbffbd08c815aa38b472999917", + "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", + "reference": "2d294d0c48df244c71c105a169d0190bfb080426", "shasum": "" }, "require": { @@ -7085,7 +7154,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.1.6" + "source": "https://github.com/symfony/uid/tree/v7.2.0" }, "funding": [ { @@ -7101,20 +7170,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8" + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8", - "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", "shasum": "" }, "require": { @@ -7130,7 +7199,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -7168,7 +7237,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.8" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" }, "funding": [ { @@ -7184,7 +7253,7 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:46:42+00:00" + "time": "2024-11-08T15:48:14+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -7325,16 +7394,16 @@ }, { "name": "voku/portable-ascii", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "b56450eed252f6801410d810c8e1727224ae0743" + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", - "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", "shasum": "" }, "require": { @@ -7359,7 +7428,7 @@ "authors": [ { "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" + "homepage": "https://www.moelleken.org/" } ], "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", @@ -7371,7 +7440,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" }, "funding": [ { @@ -7395,7 +7464,7 @@ "type": "tidelift" } ], - "time": "2022-03-08T17:03:00+00:00" + "time": "2024-11-21T01:49:47+00:00" }, { "name": "webmozart/assert", @@ -7550,69 +7619,6 @@ ], "time": "2024-10-15T12:38:31+00:00" }, - { - "name": "fakerphp/faker", - "version": "v1.24.0", - "source": { - "type": "git", - "url": "https://github.com/FakerPHP/Faker.git", - "reference": "a136842a532bac9ecd8a1c723852b09915d7db50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/a136842a532bac9ecd8a1c723852b09915d7db50", - "reference": "a136842a532bac9ecd8a1c723852b09915d7db50", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0", - "psr/container": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "conflict": { - "fzaninotto/faker": "*" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "doctrine/persistence": "^1.3 || ^2.0", - "ext-intl": "*", - "phpunit/phpunit": "^9.5.26", - "symfony/phpunit-bridge": "^5.4.16" - }, - "suggest": { - "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", - "ext-curl": "Required by Faker\\Provider\\Image to download images.", - "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", - "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", - "ext-mbstring": "Required for multibyte Unicode string functionality." - }, - "type": "library", - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "support": { - "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.24.0" - }, - "time": "2024-11-07T15:11:20+00:00" - }, { "name": "fidry/cpu-core-counter", "version": "1.2.0", @@ -7798,28 +7804,28 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.0.6", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", "shasum": "" }, "require": { - "composer-runtime-api": "^2.0.0", - "php": "^7.1|^8.0" + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "vimeo/psalm": "^4.3" + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "vimeo/psalm": "^4.3 || ^5.0" }, "type": "library", "extra": { @@ -7851,9 +7857,9 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" }, - "time": "2024-03-08T09:58:59+00:00" + "time": "2024-11-18T16:19:46+00:00" }, { "name": "laravel-shift/blueprint", @@ -8035,16 +8041,16 @@ }, { "name": "laravel/pint", - "version": "v1.18.1", + "version": "v1.18.3", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9" + "reference": "cef51821608239040ab841ad6e1c6ae502ae3026" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9", - "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9", + "url": "https://api.github.com/repos/laravel/pint/zipball/cef51821608239040ab841ad6e1c6ae502ae3026", + "reference": "cef51821608239040ab841ad6e1c6ae502ae3026", "shasum": "" }, "require": { @@ -8055,13 +8061,13 @@ "php": "^8.1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.64.0", - "illuminate/view": "^10.48.20", - "larastan/larastan": "^2.9.8", + "friendsofphp/php-cs-fixer": "^3.65.0", + "illuminate/view": "^10.48.24", + "larastan/larastan": "^2.9.11", "laravel-zero/framework": "^10.4.0", "mockery/mockery": "^1.6.12", - "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.35.1" + "nunomaduro/termwind": "^1.17.0", + "pestphp/pest": "^2.36.0" }, "bin": [ "builds/pint" @@ -8097,20 +8103,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2024-09-24T17:22:50+00:00" + "time": "2024-11-26T15:34:00+00:00" }, { "name": "laravel/sail", - "version": "v1.38.0", + "version": "v1.39.1", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "d17abae06661dd6c46d13627b1683a2924259145" + "reference": "1a3c7291bc88de983b66688919a4d298d68ddec7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/d17abae06661dd6c46d13627b1683a2924259145", - "reference": "d17abae06661dd6c46d13627b1683a2924259145", + "url": "https://api.github.com/repos/laravel/sail/zipball/1a3c7291bc88de983b66688919a4d298d68ddec7", + "reference": "1a3c7291bc88de983b66688919a4d298d68ddec7", "shasum": "" }, "require": { @@ -8160,7 +8166,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-11-11T20:16:51+00:00" + "time": "2024-11-27T15:42:28+00:00" }, { "name": "mockery/mockery", @@ -8404,38 +8410,38 @@ }, { "name": "pestphp/pest", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "179d46ce97d52bcb3f791449ae94025c3f32e3e3" + "reference": "918a8fc16996849937e281482bd34f236881ce96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/179d46ce97d52bcb3f791449ae94025c3f32e3e3", - "reference": "179d46ce97d52bcb3f791449ae94025c3f32e3e3", + "url": "https://api.github.com/repos/pestphp/pest/zipball/918a8fc16996849937e281482bd34f236881ce96", + "reference": "918a8fc16996849937e281482bd34f236881ce96", "shasum": "" }, "require": { "brianium/paratest": "^7.6.0", "nunomaduro/collision": "^8.5.0", - "nunomaduro/termwind": "^2.2.0", + "nunomaduro/termwind": "^2.3.0", "pestphp/pest-plugin": "^3.0.0", "pestphp/pest-plugin-arch": "^3.0.0", "pestphp/pest-plugin-mutate": "^3.0.5", "php": "^8.2.0", - "phpunit/phpunit": "^11.4.3" + "phpunit/phpunit": "^11.4.4" }, "conflict": { "filp/whoops": "<2.16.0", - "phpunit/phpunit": ">11.4.3", + "phpunit/phpunit": ">11.4.4", "sebastian/exporter": "<6.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { "pestphp/pest-dev-tools": "^3.3.0", - "pestphp/pest-plugin-type-coverage": "^3.1.0", - "symfony/process": "^7.1.6" + "pestphp/pest-plugin-type-coverage": "^3.2.0", + "symfony/process": "^7.1.8" }, "bin": [ "bin/pest" @@ -8500,7 +8506,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.5.1" + "source": "https://github.com/pestphp/pest/tree/v3.6.0" }, "funding": [ { @@ -8512,7 +8518,7 @@ "type": "github" } ], - "time": "2024-10-31T16:12:45+00:00" + "time": "2024-12-01T22:46:00+00:00" }, { "name": "pestphp/pest-plugin", @@ -9465,16 +9471,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.4.3", + "version": "11.4.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76" + "reference": "f9ba7bd3c9f3ff54ec379d7a1c2e3f13fe0bbde4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e8e8ed1854de5d36c088ec1833beae40d2dedd76", - "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f9ba7bd3c9f3ff54ec379d7a1c2e3f13fe0bbde4", + "reference": "f9ba7bd3c9f3ff54ec379d7a1c2e3f13fe0bbde4", "shasum": "" }, "require": { @@ -9484,7 +9490,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.0", + "myclabs/deep-copy": "^1.12.1", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", @@ -9495,7 +9501,7 @@ "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", "sebastian/code-unit": "^3.0.1", - "sebastian/comparator": "^6.1.1", + "sebastian/comparator": "^6.2.1", "sebastian/diff": "^6.0.2", "sebastian/environment": "^7.2.0", "sebastian/exporter": "^6.1.3", @@ -9545,7 +9551,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.4" }, "funding": [ { @@ -9561,7 +9567,7 @@ "type": "tidelift" } ], - "time": "2024-10-28T13:07:50+00:00" + "time": "2024-11-27T10:44:52+00:00" }, { "name": "sebastian/cli-parser", @@ -10488,20 +10494,21 @@ }, { "name": "symfony/yaml", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" + "reference": "099581e99f557e9f16b43c5916c26380b54abb22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", - "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -10539,7 +10546,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.6" + "source": "https://github.com/symfony/yaml/tree/v7.2.0" }, "funding": [ { @@ -10555,7 +10562,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-10-23T06:56:12+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", diff --git a/public/css/filament/filament/app.css b/public/css/filament/filament/app.css index bb61be9..925c77d 100644 --- a/public/css/filament/filament/app.css +++ b/public/css/filament/filament/app.css @@ -1 +1 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com*/*,:after,:before{border-color:rgba(var(--gray-200),1);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:rgba(var(--gray-400),1);opacity:1}input::placeholder,textarea::placeholder{color:rgba(var(--gray-400),1);opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],input:where(:not([type])),select,textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:rgba(var(--gray-500),var(--tw-border-opacity,1));border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,input:where(:not([type])):focus,select:focus,textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}input::-moz-placeholder,textarea::-moz-placeholder{color:rgba(var(--gray-500),var(--tw-text-opacity,1));opacity:1}input::placeholder,textarea::placeholder{color:rgba(var(--gray-500),var(--tw-text-opacity,1));opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:rgba(var(--gray-500),var(--tw-border-opacity,1));border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:1rem}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}[type=checkbox]:checked,[type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=radio]:checked:focus,[type=radio]:checked:hover{background-color:currentColor;border-color:transparent}[type=checkbox]:indeterminate{background-color:currentColor;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}@media (forced-colors:active) {[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:transparent}[type=file]{background:unset;border-color:inherit;border-radius:0;border-width:0;font-size:unset;line-height:inherit;padding:0}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}:root.dark{color-scheme:dark}[data-field-wrapper]{scroll-margin-top:8rem}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.8888889em;margin-top:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;line-height:1.2;margin-bottom:.8em;margin-top:0}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;line-height:1.4;margin-bottom:.8em;margin-top:1.6em}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.5555556em}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.4285714;margin-bottom:.5714286em;margin-top:1.4285714em}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8571429em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-top:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.25rem;font-size:.8571429em;line-height:1.6666667;margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.2857143em;margin-top:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2.8571429em;margin-top:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-base{font-size:1rem;line-height:1.75}.prose-base :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose-base :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose-base :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em}.prose-base :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.25em;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose-base :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.5em;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose-base :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.25em;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose-base :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose-base :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-base :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose-base :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-base :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-base :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-base :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.875em;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose-base :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose-base :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose-base :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose-base :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose-base :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose-base :where(.prose-base>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose-base :where(.prose-base>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose-base :where(.prose-base>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose-base :where(.prose-base>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose-base :where(.prose-base>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose-base :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose-base :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose-base :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose-base :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose-base :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3em;margin-top:3em}.prose-base :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857}.prose-base :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose-base :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-base :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-base :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose-base :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-base :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-base :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-base :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose-base :where(.prose-base>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(.prose-base>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-lg{font-size:1.125rem;line-height:1.7777778}.prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}.prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-start:1em}.prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}.prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}.prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}.prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}.prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8888889em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-top:.2222222em;padding-inline-start:.4444444em}.prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding-inline-end:1.5em;padding-bottom:1em;padding-top:1em;padding-inline-start:1.5em}.prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}.prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(.prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.prose-lg :where(.prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}.prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-top:.75em;padding-inline-start:.75em}.prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.prose-lg :where(.prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(.prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-4{inset:1rem}.inset-x-0{left:0;right:0}.inset-x-4{left:1rem;right:1rem}.inset-y-0{bottom:0;top:0}.-bottom-1\/2{bottom:-50%}.-top-1{top:-.25rem}.-top-1\/2{top:-50%}.-top-2{top:-.5rem}.-top-3{top:-.75rem}.bottom-0{bottom:0}.bottom-1\/2{bottom:50%}.end-0{inset-inline-end:0}.end-4{inset-inline-end:1rem}.end-6{inset-inline-end:1.5rem}.left-3{left:.75rem}.start-0{inset-inline-start:0}.start-full{inset-inline-start:100%}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-4{top:1rem}.top-6{top:1.5rem}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.order-first{order:-9999}.col-\[--col-span-default\]{grid-column:var(--col-span-default)}.col-span-full{grid-column:1/-1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.col-start-\[--col-start-default\]{grid-column-start:var(--col-start-default)}.row-start-2{grid-row-start:2}.-m-0\.5{margin:-.125rem}.-m-1{margin:-.25rem}.-m-1\.5{margin:-.375rem}.-m-2{margin:-.5rem}.-m-2\.5{margin:-.625rem}.-m-3{margin:-.75rem}.-m-3\.5{margin:-.875rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.-my-1{margin-bottom:-.25rem;margin-top:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.my-16{margin-bottom:4rem;margin-top:4rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-4{margin-bottom:1rem;margin-top:1rem}.my-auto{margin-bottom:auto;margin-top:auto}.\!mt-0{margin-top:0!important}.-mb-4{margin-bottom:-1rem}.-mb-6{margin-bottom:-1.5rem}.-me-2{margin-inline-end:-.5rem}.-ms-0\.5{margin-inline-start:-.125rem}.-ms-1{margin-inline-start:-.25rem}.-ms-2{margin-inline-start:-.5rem}.-mt-3{margin-top:-.75rem}.-mt-4{margin-top:-1rem}.-mt-6{margin-top:-1.5rem}.-mt-7{margin-top:-1.75rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.me-1{margin-inline-end:.25rem}.me-4{margin-inline-end:1rem}.me-6{margin-inline-end:1.5rem}.ml-auto{margin-left:auto}.ms-1{margin-inline-start:.25rem}.ms-auto{margin-inline-start:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-\[--line-clamp\]{-webkit-box-orient:vertical;-webkit-line-clamp:var(--line-clamp);display:-webkit-box;overflow:hidden}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.inline-grid{display:inline-grid}.hidden{display:none}.h-0{height:0}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-16{height:4rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-\[100dvh\],.h-dvh{height:100dvh}.h-full{height:100%}.h-screen{height:100vh}.max-h-96{max-height:24rem}.min-h-\[theme\(spacing\.48\)\]{min-height:12rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-16{width:4rem}.w-20{width:5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[--sidebar-width\]{width:var(--sidebar-width)}.w-\[calc\(100\%\+2rem\)\]{width:calc(100% + 2rem)}.w-auto{width:auto}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.w-screen{width:100vw}.min-w-0{min-width:0}.min-w-\[theme\(spacing\.4\)\]{min-width:1rem}.min-w-\[theme\(spacing\.5\)\]{min-width:1.25rem}.min-w-\[theme\(spacing\.6\)\]{min-width:1.5rem}.min-w-\[theme\(spacing\.8\)\]{min-width:2rem}.\!max-w-2xl{max-width:42rem!important}.\!max-w-3xl{max-width:48rem!important}.\!max-w-4xl{max-width:56rem!important}.\!max-w-5xl{max-width:64rem!important}.\!max-w-6xl{max-width:72rem!important}.\!max-w-7xl{max-width:80rem!important}.\!max-w-\[14rem\]{max-width:14rem!important}.\!max-w-lg{max-width:32rem!important}.\!max-w-md{max-width:28rem!important}.\!max-w-sm{max-width:24rem!important}.\!max-w-xl{max-width:36rem!important}.\!max-w-xs{max-width:20rem!important}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-fit{max-width:-moz-fit-content;max-width:fit-content}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-md{max-width:28rem}.max-w-min{max-width:-moz-min-content;max-width:min-content}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-screen-2xl{max-width:1536px}.max-w-screen-lg{max-width:1024px}.max-w-screen-md{max-width:768px}.max-w-screen-sm{max-width:640px}.max-w-screen-xl{max-width:1280px}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.table-auto{table-layout:auto}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-x-1\/4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-1\/4{--tw-translate-x:-25%}.-translate-x-12{--tw-translate-x:-3rem}.-translate-x-12,.-translate-x-5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-5{--tw-translate-x:-1.25rem}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-12{--tw-translate-y:-3rem}.-translate-y-12,.-translate-y-3\/4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-3\/4{--tw-translate-y:-75%}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-12{--tw-translate-x:3rem}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-5,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x:100%}.translate-y-12{--tw-translate-y:3rem}.-rotate-180,.translate-y-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-180{--tw-rotate:-180deg}.rotate-180{--tw-rotate:180deg}.rotate-180,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-95,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-move{cursor:move}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize{resize:both}.scroll-mt-9{scroll-margin-top:2.25rem}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.columns-\[--cols-default\]{-moz-columns:var(--cols-default);columns:var(--cols-default)}.break-inside-avoid{-moz-column-break-inside:avoid;break-inside:avoid}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.grid-flow-col{grid-auto-flow:column}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-\[--cols-default\]{grid-template-columns:var(--cols-default)}.grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr}.grid-cols-\[repeat\(7\2c minmax\(theme\(spacing\.7\)\2c 1fr\)\)\]{grid-template-columns:repeat(7,minmax(1.75rem,1fr))}.grid-cols-\[repeat\(auto-fit\2c minmax\(0\2c 1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.grid-rows-\[1fr_auto_1fr\]{grid-template-rows:1fr auto 1fr}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-start{justify-items:start}.justify-items-center{justify-items:center}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-6{row-gap:1.5rem}.gap-y-7{row-gap:1.75rem}.gap-y-8{row-gap:2rem}.gap-y-px{row-gap:1px}.-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.25rem*var(--tw-space-x-reverse))}.-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.5rem*var(--tw-space-x-reverse))}.-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.75rem*var(--tw-space-x-reverse))}.-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1rem*var(--tw-space-x-reverse))}.-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1.25rem*var(--tw-space-x-reverse))}.-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1.5rem*var(--tw-space-x-reverse))}.-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1.75rem*var(--tw-space-x-reverse))}.-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-2rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(var(--gray-100),var(--tw-divide-opacity))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(var(--gray-200),var(--tw-divide-opacity))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.justify-self-center{justify-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-x-clip{overflow-x:clip}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b-xl{border-bottom-left-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-x-\[0\.5px\]{border-left-width:.5px;border-right-width:.5px}.border-y{border-bottom-width:1px;border-top-width:1px}.\!border-t-0{border-top-width:0!important}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0}.border-e{border-inline-end-width:1px}.border-s{border-inline-start-width:1px}.border-t{border-top-width:1px}.\!border-none{border-style:none!important}.border-none{border-style:none}.border-gray-100{--tw-border-opacity:1;border-color:rgba(var(--gray-100),var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(var(--gray-200),var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(var(--gray-300),var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgba(var(--gray-600),var(--tw-border-opacity))}.border-primary-500{--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.border-primary-600{--tw-border-opacity:1;border-color:rgba(var(--primary-600),var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-t-gray-200{--tw-border-opacity:1;border-top-color:rgba(var(--gray-200),var(--tw-border-opacity))}.\!bg-gray-50{--tw-bg-opacity:1!important;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))!important}.\!bg-gray-700{--tw-bg-opacity:1!important;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))!important}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-custom-100{--tw-bg-opacity:1;background-color:rgba(var(--c-100),var(--tw-bg-opacity))}.bg-custom-50{--tw-bg-opacity:1;background-color:rgba(var(--c-50),var(--tw-bg-opacity))}.bg-custom-600{--tw-bg-opacity:1;background-color:rgba(var(--c-600),var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(var(--gray-200),var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.bg-gray-950\/50{background-color:rgba(var(--gray-950),.5)}.bg-primary-500{--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-white\/0{background-color:hsla(0,0%,100%,0)}.bg-white\/5{background-color:hsla(0,0%,100%,.05)}.\!bg-none{background-image:none!important}.bg-cover{background-size:cover}.bg-center{background-position:50%}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-3\.5{padding-bottom:.875rem;padding-top:.875rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pe-0{padding-inline-end:0}.pe-1{padding-inline-end:.25rem}.pe-2{padding-inline-end:.5rem}.pe-3{padding-inline-end:.75rem}.pe-4{padding-inline-end:1rem}.pe-6{padding-inline-end:1.5rem}.pe-8{padding-inline-end:2rem}.ps-0{padding-inline-start:0}.ps-1{padding-inline-start:.25rem}.ps-2{padding-inline-start:.5rem}.ps-3{padding-inline-start:.75rem}.ps-4{padding-inline-start:1rem}.ps-\[5\.25rem\]{padding-inline-start:5.25rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.text-start{text-align:start}.text-end{text-align:end}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.font-thin{font-weight:100}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-loose{line-height:2}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.text-custom-400{--tw-text-opacity:1;color:rgba(var(--c-400),var(--tw-text-opacity))}.text-custom-50{--tw-text-opacity:1;color:rgba(var(--c-50),var(--tw-text-opacity))}.text-custom-500{--tw-text-opacity:1;color:rgba(var(--c-500),var(--tw-text-opacity))}.text-custom-600{--tw-text-opacity:1;color:rgba(var(--c-600),var(--tw-text-opacity))}.text-custom-700\/50{color:rgba(var(--c-700),.5)}.text-danger-600{--tw-text-opacity:1;color:rgba(var(--danger-600),var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(var(--gray-100),var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(var(--gray-600),var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.text-gray-700\/50{color:rgba(var(--gray-700),.5)}.text-gray-950{--tw-text-opacity:1;color:rgba(var(--gray-950),var(--tw-text-opacity))}.text-primary-400{--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.text-primary-600{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-sm,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-0{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-1,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-custom-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-600),var(--tw-ring-opacity))}.ring-custom-600\/10{--tw-ring-color:rgba(var(--c-600),0.1)}.ring-custom-600\/20{--tw-ring-color:rgba(var(--c-600),0.2)}.ring-danger-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-600),var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-200),var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-300),var(--tw-ring-opacity))}.ring-gray-600\/10{--tw-ring-color:rgba(var(--gray-600),0.1)}.ring-gray-900\/10{--tw-ring-color:rgba(var(--gray-900),0.1)}.ring-gray-950\/10{--tw-ring-color:rgba(var(--gray-950),0.1)}.ring-gray-950\/5{--tw-ring-color:rgba(var(--gray-950),0.05)}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.ring-white\/10{--tw-ring-color:hsla(0,0%,100%,.1)}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.delay-100{transition-delay:.1s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[transform\:translateZ\(0\)\]{transform:translateZ(0)}.dark\:prose-invert:is(.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-y-0:before{bottom:0;content:var(--tw-content);top:0}.before\:start-0:before{content:var(--tw-content);inset-inline-start:0}.before\:h-full:before{content:var(--tw-content);height:100%}.before\:w-0\.5:before{content:var(--tw-content);width:.125rem}.before\:bg-primary-600:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity));content:var(--tw-content)}.first\:border-s-0:first-child{border-inline-start-width:0}.first\:border-t-0:first-child{border-top-width:0}.last\:border-e-0:last-child{border-inline-end-width:0}.first-of-type\:ps-1:first-of-type{padding-inline-start:.25rem}.last-of-type\:pe-1:last-of-type{padding-inline-end:.25rem}.checked\:ring-0:checked{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.hover\:bg-custom-400\/10:hover{background-color:rgba(var(--c-400),.1)}.hover\:bg-custom-50:hover{--tw-bg-opacity:1;background-color:rgba(var(--c-50),var(--tw-bg-opacity))}.hover\:bg-custom-500:hover{--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.hover\:bg-gray-400\/10:hover{background-color:rgba(var(--gray-400),.1)}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.hover\:text-custom-600:hover{--tw-text-opacity:1;color:rgba(var(--c-600),var(--tw-text-opacity))}.hover\:text-custom-700\/75:hover{color:rgba(var(--c-700),.75)}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.hover\:text-gray-700\/75:hover{color:rgba(var(--gray-700),.75)}.hover\:opacity-100:hover{opacity:1}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-danger-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-600),var(--tw-ring-opacity))}.focus\:ring-primary-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.checked\:focus\:ring-danger-500\/50:focus:checked{--tw-ring-color:rgba(var(--danger-500),0.5)}.checked\:focus\:ring-primary-500\/50:focus:checked{--tw-ring-color:rgba(var(--primary-500),0.5)}.focus-visible\:z-10:focus-visible{z-index:10}.focus-visible\:border-primary-500:focus-visible{--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.focus-visible\:bg-custom-50:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--c-50),var(--tw-bg-opacity))}.focus-visible\:bg-gray-100:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.focus-visible\:bg-gray-50:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.focus-visible\:text-custom-700\/75:focus-visible{color:rgba(var(--c-700),.75)}.focus-visible\:text-gray-500:focus-visible{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.focus-visible\:text-gray-700\/75:focus-visible{color:rgba(var(--gray-700),.75)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset:inset}.focus-visible\:ring-custom-500\/50:focus-visible{--tw-ring-color:rgba(var(--c-500),0.5)}.focus-visible\:ring-custom-600:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-600),var(--tw-ring-opacity))}.focus-visible\:ring-gray-400\/40:focus-visible{--tw-ring-color:rgba(var(--gray-400),0.4)}.focus-visible\:ring-primary-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.focus-visible\:ring-primary-600:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.enabled\:cursor-wait:enabled{cursor:wait}.enabled\:opacity-70:enabled{opacity:.7}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:bg-gray-50:disabled{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.disabled\:text-gray-50:disabled{--tw-text-opacity:1;color:rgba(var(--gray-50),var(--tw-text-opacity))}.disabled\:text-gray-500:disabled{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.disabled\:opacity-70:disabled{opacity:.7}.disabled\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled{-webkit-text-fill-color:rgba(var(--gray-500),1)}.disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled::-moz-placeholder{-webkit-text-fill-color:rgba(var(--gray-400),1)}.disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled::placeholder{-webkit-text-fill-color:rgba(var(--gray-400),1)}.disabled\:checked\:bg-current:checked:disabled{background-color:currentColor}.disabled\:checked\:text-gray-400:checked:disabled{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group\/item:first-child .group-first\/item\:rounded-s-lg{border-end-start-radius:.5rem;border-start-start-radius:.5rem}.group\/item:last-child .group-last\/item\:rounded-e-lg{border-end-end-radius:.5rem;border-start-end-radius:.5rem}.group:hover .group-hover\:text-gray-500,.group\/button:hover .group-hover\/button\:text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.group\/item:hover .group-hover\/item\:underline,.group\/link:hover .group-hover\/link\:underline{text-decoration-line:underline}.group:focus-visible .group-focus-visible\:text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.group:focus-visible .group-focus-visible\:text-gray-700{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.group\/item:focus-visible .group-focus-visible\/item\:underline{text-decoration-line:underline}.group\/link:focus-visible .group-focus-visible\/link\:underline{text-decoration-line:underline}.dark\:flex:is(.dark *){display:flex}.dark\:hidden:is(.dark *){display:none}.dark\:divide-white\/10:is(.dark *)>:not([hidden])~:not([hidden]){border-color:hsla(0,0%,100%,.1)}.dark\:divide-white\/5:is(.dark *)>:not([hidden])~:not([hidden]){border-color:hsla(0,0%,100%,.05)}.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--gray-600),var(--tw-border-opacity))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--gray-700),var(--tw-border-opacity))}.dark\:border-primary-500:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.dark\:border-white\/10:is(.dark *){border-color:hsla(0,0%,100%,.1)}.dark\:border-white\/5:is(.dark *){border-color:hsla(0,0%,100%,.05)}.dark\:border-t-white\/10:is(.dark *){border-top-color:hsla(0,0%,100%,.1)}.dark\:\!bg-gray-700:is(.dark *){--tw-bg-opacity:1!important;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))!important}.dark\:bg-custom-400\/10:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:bg-custom-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}.dark\:bg-custom-500\/20:is(.dark *){background-color:rgba(var(--c-500),.2)}.dark\:bg-gray-400\/10:is(.dark *){background-color:rgba(var(--gray-400),.1)}.dark\:bg-gray-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity))}.dark\:bg-gray-500\/20:is(.dark *){background-color:rgba(var(--gray-500),.2)}.dark\:bg-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.dark\:bg-gray-900\/30:is(.dark *){background-color:rgba(var(--gray-900),.3)}.dark\:bg-gray-950:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-950),var(--tw-bg-opacity))}.dark\:bg-gray-950\/75:is(.dark *){background-color:rgba(var(--gray-950),.75)}.dark\:bg-primary-400:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-400),var(--tw-bg-opacity))}.dark\:bg-primary-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.dark\:bg-transparent:is(.dark *){background-color:transparent}.dark\:bg-white\/10:is(.dark *){background-color:hsla(0,0%,100%,.1)}.dark\:bg-white\/5:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:fill-current:is(.dark *){fill:currentColor}.dark\:text-custom-300\/50:is(.dark *){color:rgba(var(--c-300),.5)}.dark\:text-custom-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--c-400),var(--tw-text-opacity))}.dark\:text-custom-400\/10:is(.dark *){color:rgba(var(--c-400),.1)}.dark\:text-danger-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--danger-400),var(--tw-text-opacity))}.dark\:text-danger-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--danger-500),var(--tw-text-opacity))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.dark\:text-gray-300\/50:is(.dark *){color:rgba(var(--gray-300),.5)}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:text-gray-700:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.dark\:text-gray-800:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-800),var(--tw-text-opacity))}.dark\:text-primary-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.dark\:text-primary-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark\:text-white\/5:is(.dark *){color:hsla(0,0%,100%,.05)}.dark\:ring-custom-400\/30:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.3)}.dark\:ring-custom-500:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-500),var(--tw-ring-opacity))}.dark\:ring-danger-500:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:ring-gray-400\/20:is(.dark *){--tw-ring-color:rgba(var(--gray-400),0.2)}.dark\:ring-gray-50\/10:is(.dark *){--tw-ring-color:rgba(var(--gray-50),0.1)}.dark\:ring-gray-700:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-700),var(--tw-ring-opacity))}.dark\:ring-gray-900:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-900),var(--tw-ring-opacity))}.dark\:ring-white\/10:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1)}.dark\:ring-white\/20:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2)}.dark\:placeholder\:text-gray-500:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:placeholder\:text-gray-500:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:before\:bg-primary-500:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity));content:var(--tw-content)}.dark\:checked\:bg-danger-500:checked:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--danger-500),var(--tw-bg-opacity))}.dark\:checked\:bg-primary-500:checked:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.dark\:focus-within\:bg-white\/5:focus-within:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:hover\:bg-custom-400:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-400),var(--tw-bg-opacity))}.dark\:hover\:bg-custom-400\/10:hover:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:hover\:bg-white\/10:hover:is(.dark *){background-color:hsla(0,0%,100%,.1)}.dark\:hover\:bg-white\/5:hover:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:hover\:text-custom-300:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--c-300),var(--tw-text-opacity))}.dark\:hover\:text-custom-300\/75:hover:is(.dark *){color:rgba(var(--c-300),.75)}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.dark\:hover\:text-gray-300\/75:hover:is(.dark *){color:rgba(var(--gray-300),.75)}.dark\:hover\:text-gray-400:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:hover\:ring-white\/20:hover:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2)}.dark\:focus\:ring-danger-500:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:focus\:ring-primary-500:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.dark\:checked\:focus\:ring-danger-400\/50:focus:checked:is(.dark *){--tw-ring-color:rgba(var(--danger-400),0.5)}.dark\:checked\:focus\:ring-primary-400\/50:focus:checked:is(.dark *){--tw-ring-color:rgba(var(--primary-400),0.5)}.dark\:focus-visible\:border-primary-500:focus-visible:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.dark\:focus-visible\:bg-custom-400\/10:focus-visible:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:focus-visible\:bg-white\/5:focus-visible:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:focus-visible\:text-custom-300\/75:focus-visible:is(.dark *){color:rgba(var(--c-300),.75)}.dark\:focus-visible\:text-gray-300\/75:focus-visible:is(.dark *){color:rgba(var(--gray-300),.75)}.dark\:focus-visible\:text-gray-400:focus-visible:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:focus-visible\:ring-custom-400\/50:focus-visible:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.5)}.dark\:focus-visible\:ring-custom-500:focus-visible:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-500),var(--tw-ring-opacity))}.dark\:focus-visible\:ring-primary-500:focus-visible:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.dark\:disabled\:bg-transparent:disabled:is(.dark *){background-color:transparent}.dark\:disabled\:text-gray-400:disabled:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:disabled\:ring-white\/10:disabled:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1)}.dark\:disabled\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled:is(.dark *){-webkit-text-fill-color:rgba(var(--gray-400),1)}.dark\:disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled:is(.dark *)::-moz-placeholder{-webkit-text-fill-color:rgba(var(--gray-500),1)}.dark\:disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled:is(.dark *)::placeholder{-webkit-text-fill-color:rgba(var(--gray-500),1)}.dark\:disabled\:checked\:bg-gray-600:checked:disabled:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}.group\/button:hover .dark\:group-hover\/button\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group:hover .dark\:group-hover\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.group:hover .dark\:group-hover\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group:focus-visible .dark\:group-focus-visible\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.group:focus-visible .dark\:group-focus-visible\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}@media (min-width:640px){.sm\:relative{position:relative}.sm\:inset-x-auto{left:auto;right:auto}.sm\:end-0{inset-inline-end:0}.sm\:col-\[--col-span-sm\]{grid-column:var(--col-span-sm)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-start-\[--col-start-sm\]{grid-column-start:var(--col-start-sm)}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:-my-2{margin-bottom:-.5rem;margin-top:-.5rem}.sm\:ms-auto{margin-inline-start:auto}.sm\:mt-7{margin-top:1.75rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:table-cell{display:table-cell}.sm\:grid{display:grid}.sm\:inline-grid{display:inline-grid}.sm\:hidden{display:none}.sm\:w-\[calc\(100\%\+3rem\)\]{width:calc(100% + 3rem)}.sm\:w-screen{width:100vw}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-3xl{max-width:48rem}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-5xl{max-width:64rem}.sm\:max-w-6xl{max-width:72rem}.sm\:max-w-7xl{max-width:80rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-md{max-width:28rem}.sm\:max-w-sm{max-width:24rem}.sm\:max-w-xl{max-width:36rem}.sm\:max-w-xs{max-width:20rem}.sm\:columns-\[--cols-sm\]{-moz-columns:var(--cols-sm);columns:var(--cols-sm)}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[--cols-sm\]{grid-template-columns:var(--cols-sm)}.sm\:grid-cols-\[repeat\(auto-fit\2c minmax\(0\2c 1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.sm\:grid-rows-\[1fr_auto_3fr\]{grid-template-rows:1fr auto 3fr}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-1{gap:.25rem}.sm\:gap-3{gap:.75rem}.sm\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.sm\:rounded-xl{border-radius:.75rem}.sm\:p-10{padding:2.5rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.sm\:pe-3{padding-inline-end:.75rem}.sm\:pe-6{padding-inline-end:1.5rem}.sm\:ps-3{padding-inline-start:.75rem}.sm\:ps-6{padding-inline-start:1.5rem}.sm\:pt-1\.5{padding-top:.375rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:leading-6{line-height:1.5rem}.sm\:first-of-type\:ps-3:first-of-type{padding-inline-start:.75rem}.sm\:first-of-type\:ps-6:first-of-type{padding-inline-start:1.5rem}.sm\:last-of-type\:pe-3:last-of-type{padding-inline-end:.75rem}.sm\:last-of-type\:pe-6:last-of-type{padding-inline-end:1.5rem}}@media (min-width:768px){.md\:bottom-4{bottom:1rem}.md\:order-first{order:-9999}.md\:col-\[--col-span-md\]{grid-column:var(--col-span-md)}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-start-\[--col-start-md\]{grid-column-start:var(--col-start-md)}.md\:block{display:block}.md\:flex{display:flex}.md\:table-cell{display:table-cell}.md\:inline-grid{display:inline-grid}.md\:hidden{display:none}.md\:w-max{width:-moz-max-content;width:max-content}.md\:max-w-60{max-width:15rem}.md\:columns-\[--cols-md\]{-moz-columns:var(--cols-md);columns:var(--cols-md)}.md\:grid-flow-col{grid-auto-flow:column}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[--cols-md\]{grid-template-columns:var(--cols-md)}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:gap-1{gap:.25rem}.md\:gap-3{gap:.75rem}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(0px*var(--tw-divide-y-reverse));border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)))}.md\:overflow-x-auto{overflow-x:auto}.md\:rounded-xl{border-radius:.75rem}.md\:p-20{padding:5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:pe-6{padding-inline-end:1.5rem}.md\:ps-3{padding-inline-start:.75rem}}@media (min-width:1024px){.lg\:sticky{position:sticky}.lg\:z-0{z-index:0}.lg\:col-\[--col-span-lg\]{grid-column:var(--col-span-lg)}.lg\:col-start-\[--col-start-lg\]{grid-column-start:var(--col-start-lg)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:table-cell{display:table-cell}.lg\:inline-grid{display:inline-grid}.lg\:hidden{display:none}.lg\:h-full{height:100%}.lg\:max-w-xs{max-width:20rem}.lg\:-translate-x-full{--tw-translate-x:-100%}.lg\:-translate-x-full,.lg\:translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:translate-x-0{--tw-translate-x:0px}.lg\:columns-\[--cols-lg\]{-moz-columns:var(--cols-lg);columns:var(--cols-lg)}.lg\:grid-cols-\[--cols-lg\]{grid-template-columns:var(--cols-lg)}.lg\:flex-row{flex-direction:row}.lg\:items-start{align-items:flex-start}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:gap-1{gap:.25rem}.lg\:gap-3{gap:.75rem}.lg\:bg-transparent{background-color:transparent}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pe-8{padding-inline-end:2rem}.lg\:shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.lg\:shadow-none,.lg\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lg\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.lg\:transition-none{transition-property:none}.lg\:delay-100{transition-delay:.1s}.dark\:lg\:bg-transparent:is(.dark *){background-color:transparent}}@media (min-width:1280px){.xl\:col-\[--col-span-xl\]{grid-column:var(--col-span-xl)}.xl\:col-start-\[--col-start-xl\]{grid-column-start:var(--col-start-xl)}.xl\:block{display:block}.xl\:table-cell{display:table-cell}.xl\:inline-grid{display:inline-grid}.xl\:hidden{display:none}.xl\:columns-\[--cols-xl\]{-moz-columns:var(--cols-xl);columns:var(--cols-xl)}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[--cols-xl\]{grid-template-columns:var(--cols-xl)}.xl\:flex-row{flex-direction:row}.xl\:items-start{align-items:flex-start}.xl\:items-end{align-items:flex-end}.xl\:items-center{align-items:center}.xl\:gap-1{gap:.25rem}.xl\:gap-3{gap:.75rem}}@media (min-width:1536px){.\32xl\:col-\[--col-span-2xl\]{grid-column:var(--col-span-2xl)}.\32xl\:col-start-\[--col-start-2xl\]{grid-column-start:var(--col-start-2xl)}.\32xl\:block{display:block}.\32xl\:table-cell{display:table-cell}.\32xl\:inline-grid{display:inline-grid}.\32xl\:hidden{display:none}.\32xl\:columns-\[--cols-2xl\]{-moz-columns:var(--cols-2xl);columns:var(--cols-2xl)}.\32xl\:grid-cols-\[--cols-2xl\]{grid-template-columns:var(--cols-2xl)}.\32xl\:flex-row{flex-direction:row}.\32xl\:items-start{align-items:flex-start}.\32xl\:items-end{align-items:flex-end}.\32xl\:items-center{align-items:center}.\32xl\:gap-1{gap:.25rem}.\32xl\:gap-3{gap:.75rem}}.ltr\:hidden:where([dir=ltr],[dir=ltr] *){display:none}.rtl\:hidden:where([dir=rtl],[dir=rtl] *){display:none}.rtl\:-translate-x-0:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-translate-x-5:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:translate-x-1\/2:where([dir=rtl],[dir=rtl] *){--tw-translate-x:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:translate-x-1\/4:where([dir=rtl],[dir=rtl] *){--tw-translate-x:25%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:rotate-180:where([dir=rtl],[dir=rtl] *){--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:flex-row-reverse:where([dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.rtl\:divide-x-reverse:where([dir=rtl],[dir=rtl] *)>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}@media (min-width:1024px){.rtl\:lg\:-translate-x-0:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:lg\:translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}.\[\&\.trix-active\]\:bg-gray-50.trix-active{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.\[\&\.trix-active\]\:text-primary-600.trix-active{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity))}.dark\:\[\&\.trix-active\]\:bg-white\/5.trix-active:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:\[\&\.trix-active\]\:text-primary-400.trix-active:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.\[\&\:\:-ms-reveal\]\:hidden::-ms-reveal{display:none}.\[\&\:not\(\:first-of-type\)\]\:border-s:not(:first-of-type){border-inline-start-width:1px}.\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-2:focus-within:not(:has(.fi-ac-action:focus)){--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-danger-600:focus-within:not(:has(.fi-ac-action:focus)){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-600),var(--tw-ring-opacity))}.\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-primary-600:focus-within:not(:has(.fi-ac-action:focus)){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.dark\:\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-danger-500:focus-within:not(:has(.fi-ac-action:focus)):is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-primary-500:focus-within:not(:has(.fi-ac-action:focus)):is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.\[\&\:not\(\:last-of-type\)\]\:border-e:not(:last-of-type){border-inline-end-width:1px}.\[\&\:not\(\:nth-child\(1_of_\.fi-btn\)\)\]\:shadow-\[-1px_0_0_0_theme\(colors\.gray\.200\)\]:not(:nth-child(1 of .fi-btn)){--tw-shadow:-1px 0 0 0 rgba(var(--gray-200),1);--tw-shadow-colored:-1px 0 0 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dark\:\[\&\:not\(\:nth-child\(1_of_\.fi-btn\)\)\]\:shadow-\[-1px_0_0_0_theme\(colors\.white\/20\%\)\]:not(:nth-child(1 of .fi-btn)):is(.dark *){--tw-shadow:-1px 0 0 0 hsla(0,0%,100%,.2);--tw-shadow-colored:-1px 0 0 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\[\&\:not\(\:nth-last-child\(1_of_\.fi-btn\)\)\]\:me-px:not(:nth-last-child(1 of .fi-btn)){margin-inline-end:1px}.\[\&\:nth-child\(1_of_\.fi-btn\)\]\:rounded-s-lg:nth-child(1 of .fi-btn){border-end-start-radius:.5rem;border-start-start-radius:.5rem}.\[\&\:nth-last-child\(1_of_\.fi-btn\)\]\:rounded-e-lg:nth-last-child(1 of .fi-btn){border-end-end-radius:.5rem;border-start-end-radius:.5rem}.\[\&\>\*\:first-child\]\:relative>:first-child{position:relative}.\[\&\>\*\:first-child\]\:mt-0>:first-child{margin-top:0}.\[\&\>\*\:first-child\]\:before\:absolute>:first-child:before{content:var(--tw-content);position:absolute}.\[\&\>\*\:first-child\]\:before\:inset-y-0>:first-child:before{bottom:0;content:var(--tw-content);top:0}.\[\&\>\*\:first-child\]\:before\:start-0>:first-child:before{content:var(--tw-content);inset-inline-start:0}.\[\&\>\*\:first-child\]\:before\:w-0\.5>:first-child:before{content:var(--tw-content);width:.125rem}.\[\&\>\*\:first-child\]\:before\:bg-primary-600>:first-child:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity));content:var(--tw-content)}.\[\&\>\*\:first-child\]\:dark\:before\:bg-primary-500:is(.dark *)>:first-child:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity));content:var(--tw-content)}.\[\&\>\*\:last-child\]\:mb-0>:last-child{margin-bottom:0}.\[\&_\.choices\\_\\_inner\]\:ps-0 .choices__inner{padding-inline-start:0}.\[\&_\.fi-badge-delete-button\]\:hidden .fi-badge-delete-button{display:none}.\[\&_\.filepond--root\]\:font-sans .filepond--root{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.\[\&_optgroup\]\:bg-white optgroup{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.\[\&_optgroup\]\:dark\:bg-gray-900:is(.dark *) optgroup{--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.\[\&_option\]\:bg-white option{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.\[\&_option\]\:dark\:bg-gray-900:is(.dark *) option{--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}:checked+*>.\[\:checked\+\*\>\&\]\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}@media(hover:hover){.\[\@media\(hover\:hover\)\]\:transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.\[\@media\(hover\:hover\)\]\:duration-75{transition-duration:75ms}}input:checked+.\[input\:checked\+\&\]\:bg-custom-600{--tw-bg-opacity:1;background-color:rgba(var(--c-600),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}input:checked+.\[input\:checked\+\&\]\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}input:checked+.\[input\:checked\+\&\]\:hover\:bg-custom-500:hover{--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:bg-custom-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:bg-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:hover\:bg-custom-400:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-400),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:hover\:bg-gray-500:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity))}input:checked:focus-visible+.\[input\:checked\:focus-visible\+\&\]\:ring-custom-500\/50{--tw-ring-color:rgba(var(--c-500),0.5)}input:checked:focus-visible+.dark\:\[input\:checked\:focus-visible\+\&\]\:ring-custom-400\/50:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.5)}input:focus-visible+.\[input\:focus-visible\+\&\]\:z-10{z-index:10}input:focus-visible+.\[input\:focus-visible\+\&\]\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}input:focus-visible+.\[input\:focus-visible\+\&\]\:ring-gray-950\/10{--tw-ring-color:rgba(var(--gray-950),0.1)}input:focus-visible+.dark\:\[input\:focus-visible\+\&\]\:ring-white\/20:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2)} \ No newline at end of file +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com*/*,:after,:before{border-color:rgba(var(--gray-200),1);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:rgba(var(--gray-400),1);opacity:1}input::placeholder,textarea::placeholder{color:rgba(var(--gray-400),1);opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],input:where(:not([type])),select,textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:rgba(var(--gray-500),var(--tw-border-opacity,1));border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,input:where(:not([type])):focus,select:focus,textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}input::-moz-placeholder,textarea::-moz-placeholder{color:rgba(var(--gray-500),var(--tw-text-opacity,1));opacity:1}input::placeholder,textarea::placeholder{color:rgba(var(--gray-500),var(--tw-text-opacity,1));opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:rgba(var(--gray-500),var(--tw-border-opacity,1));border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:1rem}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}[type=checkbox]:checked,[type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=radio]:checked:focus,[type=radio]:checked:hover{background-color:currentColor;border-color:transparent}[type=checkbox]:indeterminate{background-color:currentColor;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}@media (forced-colors:active) {[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:transparent}[type=file]{background:unset;border-color:inherit;border-radius:0;border-width:0;font-size:unset;line-height:inherit;padding:0}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}:root.dark{color-scheme:dark}[data-field-wrapper]{scroll-margin-top:8rem}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-inline-start-color:var(--tw-prose-quote-borders);border-inline-start-width:.25rem;color:var(--tw-prose-quotes);font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em;quotes:"\201C""\201D""\2018""\2019"}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-bottom:2em;margin-top:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);color:var(--tw-prose-kbd);font-family:inherit;font-size:.875em;font-weight:500;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--tw-prose-pre-bg);border-radius:.375rem;color:var(--tw-prose-pre-code);font-size:.875em;font-weight:400;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;width:100%}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-th-borders);border-bottom-width:1px}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;vertical-align:bottom}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-color:var(--tw-prose-td-borders);border-bottom-width:1px}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-color:var(--tw-prose-th-borders);border-top-width:1px}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.8888889em;margin-top:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;line-height:1.2;margin-bottom:.8em;margin-top:0}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;line-height:1.4;margin-bottom:.8em;margin-top:1.6em}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.5555556em}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.4285714;margin-bottom:.5714286em;margin-top:1.4285714em}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8571429em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-top:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.25rem;font-size:.8571429em;line-height:1.6666667;margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.2857143em;margin-top:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5714286em;margin-top:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em;margin-top:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2.8571429em;margin-top:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-top:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7142857em;margin-top:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-base{font-size:1rem;line-height:1.75}.prose-base :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose-base :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose-base :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6em;margin-top:1.6em;padding-inline-start:1em}.prose-base :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.25em;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose-base :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.5em;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose-base :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.25em;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose-base :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose-base :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-base :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-top:.1875em;padding-inline-start:.375em}.prose-base :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-base :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-base :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-base :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.875em;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-top:.8571429em;padding-inline-start:1.1428571em}.prose-base :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose-base :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em;padding-inline-start:1.625em}.prose-base :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.5em;margin-top:.5em}.prose-base :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose-base :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose-base :where(.prose-base>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose-base :where(.prose-base>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose-base :where(.prose-base>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose-base :where(.prose-base>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose-base :where(.prose-base>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose-base :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.75em;margin-top:.75em}.prose-base :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em;margin-top:1.25em}.prose-base :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose-base :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose-base :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3em;margin-top:3em}.prose-base :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.7142857}.prose-base :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose-base :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-base :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-base :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-top:.5714286em;padding-inline-start:.5714286em}.prose-base :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-base :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-base :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:2em;margin-top:2em}.prose-base :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-base :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose-base :where(.prose-base>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-base :where(.prose-base>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-lg{font-size:1.125rem;line-height:1.7777778}.prose-lg :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.prose-lg :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2222222em;line-height:1.4545455;margin-bottom:1.0909091em;margin-top:1.0909091em}.prose-lg :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.6666667em;margin-top:1.6666667em;padding-inline-start:1em}.prose-lg :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.6666667em;line-height:1;margin-bottom:.8333333em;margin-top:0}.prose-lg :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.6666667em;line-height:1.3333333;margin-bottom:1.0666667em;margin-top:1.8666667em}.prose-lg :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.3333333em;line-height:1.5;margin-bottom:.6666667em;margin-top:1.6666667em}.prose-lg :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){line-height:1.5555556;margin-bottom:.4444444em;margin-top:1.7777778em}.prose-lg :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-lg :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.3125rem;font-size:.8888889em;padding-inline-end:.4444444em;padding-bottom:.2222222em;padding-top:.2222222em;padding-inline-start:.4444444em}.prose-lg :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-lg :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8666667em}.prose-lg :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.875em}.prose-lg :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.375rem;font-size:.8888889em;line-height:1.75;margin-bottom:2em;margin-top:2em;padding-inline-end:1.5em;padding-bottom:1em;padding-top:1em;padding-inline-start:1.5em}.prose-lg :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em;padding-inline-start:1.5555556em}.prose-lg :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.6666667em;margin-top:.6666667em}.prose-lg :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4444444em}.prose-lg :where(.prose-lg>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.prose-lg :where(.prose-lg>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(.prose-lg>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em}.prose-lg :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:.8888889em;margin-top:.8888889em}.prose-lg :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.3333333em;margin-top:1.3333333em}.prose-lg :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em}.prose-lg :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.6666667em;padding-inline-start:1.5555556em}.prose-lg :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:3.1111111em;margin-top:3.1111111em}.prose-lg :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5}.prose-lg :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-inline-start:.75em}.prose-lg :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:.75em;padding-bottom:.75em;padding-top:.75em;padding-inline-start:.75em}.prose-lg :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-lg :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-lg :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.7777778em;margin-top:1.7777778em}.prose-lg :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0;margin-top:0}.prose-lg :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em;line-height:1.5;margin-top:1em}.prose-lg :where(.prose-lg>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-lg :where(.prose-lg>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-4{inset:1rem}.inset-x-0{left:0;right:0}.inset-x-4{left:1rem;right:1rem}.inset-y-0{bottom:0;top:0}.-bottom-1\/2{bottom:-50%}.-top-1{top:-.25rem}.-top-1\/2{top:-50%}.-top-2{top:-.5rem}.-top-3{top:-.75rem}.bottom-0{bottom:0}.bottom-1\/2{bottom:50%}.end-0{inset-inline-end:0}.end-4{inset-inline-end:1rem}.end-6{inset-inline-end:1.5rem}.left-3{left:.75rem}.start-0{inset-inline-start:0}.start-full{inset-inline-start:100%}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-4{top:1rem}.top-6{top:1.5rem}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.order-first{order:-9999}.col-\[--col-span-default\]{grid-column:var(--col-span-default)}.col-span-full{grid-column:1/-1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.col-start-\[--col-start-default\]{grid-column-start:var(--col-start-default)}.row-start-2{grid-row-start:2}.-m-0\.5{margin:-.125rem}.-m-1{margin:-.25rem}.-m-1\.5{margin:-.375rem}.-m-2{margin:-.5rem}.-m-2\.5{margin:-.625rem}.-m-3{margin:-.75rem}.-m-3\.5{margin:-.875rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.-my-1{margin-bottom:-.25rem;margin-top:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.my-16{margin-bottom:4rem;margin-top:4rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-4{margin-bottom:1rem;margin-top:1rem}.my-auto{margin-bottom:auto;margin-top:auto}.\!mt-0{margin-top:0!important}.-mb-4{margin-bottom:-1rem}.-mb-6{margin-bottom:-1.5rem}.-me-2{margin-inline-end:-.5rem}.-ms-0\.5{margin-inline-start:-.125rem}.-ms-1{margin-inline-start:-.25rem}.-ms-2{margin-inline-start:-.5rem}.-mt-3{margin-top:-.75rem}.-mt-4{margin-top:-1rem}.-mt-6{margin-top:-1.5rem}.-mt-7{margin-top:-1.75rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.me-1{margin-inline-end:.25rem}.me-3{margin-inline-end:.75rem}.me-4{margin-inline-end:1rem}.me-6{margin-inline-end:1.5rem}.ml-auto{margin-left:auto}.ms-1{margin-inline-start:.25rem}.ms-auto{margin-inline-start:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-\[--line-clamp\]{-webkit-box-orient:vertical;-webkit-line-clamp:var(--line-clamp);display:-webkit-box;overflow:hidden}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.inline-grid{display:inline-grid}.hidden{display:none}.h-0{height:0}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-16{height:4rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-\[100dvh\],.h-dvh{height:100dvh}.h-full{height:100%}.h-screen{height:100vh}.max-h-96{max-height:24rem}.min-h-\[theme\(spacing\.48\)\]{min-height:12rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-16{width:4rem}.w-20{width:5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[--sidebar-width\]{width:var(--sidebar-width)}.w-\[calc\(100\%\+2rem\)\]{width:calc(100% + 2rem)}.w-auto{width:auto}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.w-screen{width:100vw}.min-w-0{min-width:0}.min-w-\[theme\(spacing\.4\)\]{min-width:1rem}.min-w-\[theme\(spacing\.5\)\]{min-width:1.25rem}.min-w-\[theme\(spacing\.6\)\]{min-width:1.5rem}.min-w-\[theme\(spacing\.8\)\]{min-width:2rem}.\!max-w-2xl{max-width:42rem!important}.\!max-w-3xl{max-width:48rem!important}.\!max-w-4xl{max-width:56rem!important}.\!max-w-5xl{max-width:64rem!important}.\!max-w-6xl{max-width:72rem!important}.\!max-w-7xl{max-width:80rem!important}.\!max-w-\[14rem\]{max-width:14rem!important}.\!max-w-lg{max-width:32rem!important}.\!max-w-md{max-width:28rem!important}.\!max-w-sm{max-width:24rem!important}.\!max-w-xl{max-width:36rem!important}.\!max-w-xs{max-width:20rem!important}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-fit{max-width:-moz-fit-content;max-width:fit-content}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-md{max-width:28rem}.max-w-min{max-width:-moz-min-content;max-width:min-content}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-screen-2xl{max-width:1536px}.max-w-screen-lg{max-width:1024px}.max-w-screen-md{max-width:768px}.max-w-screen-sm{max-width:640px}.max-w-screen-xl{max-width:1280px}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.table-auto{table-layout:auto}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-x-1\/4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-1\/4{--tw-translate-x:-25%}.-translate-x-12{--tw-translate-x:-3rem}.-translate-x-12,.-translate-x-5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-5{--tw-translate-x:-1.25rem}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-12{--tw-translate-y:-3rem}.-translate-y-12,.-translate-y-3\/4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-3\/4{--tw-translate-y:-75%}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-12{--tw-translate-x:3rem}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-5,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x:100%}.translate-y-12{--tw-translate-y:3rem}.-rotate-180,.translate-y-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-180{--tw-rotate:-180deg}.rotate-180{--tw-rotate:180deg}.rotate-180,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-95,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-move{cursor:move}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize{resize:both}.scroll-mt-9{scroll-margin-top:2.25rem}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.columns-\[--cols-default\]{-moz-columns:var(--cols-default);columns:var(--cols-default)}.break-inside-avoid{-moz-column-break-inside:avoid;break-inside:avoid}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.grid-flow-col{grid-auto-flow:column}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-\[--cols-default\]{grid-template-columns:var(--cols-default)}.grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr}.grid-cols-\[repeat\(7\2c minmax\(theme\(spacing\.7\)\2c 1fr\)\)\]{grid-template-columns:repeat(7,minmax(1.75rem,1fr))}.grid-cols-\[repeat\(auto-fit\2c minmax\(0\2c 1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.grid-rows-\[1fr_auto_1fr\]{grid-template-rows:1fr auto 1fr}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-start{justify-items:start}.justify-items-center{justify-items:center}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-6{row-gap:1.5rem}.gap-y-7{row-gap:1.75rem}.gap-y-8{row-gap:2rem}.gap-y-px{row-gap:1px}.-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.25rem*var(--tw-space-x-reverse))}.-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.5rem*var(--tw-space-x-reverse))}.-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.75rem*var(--tw-space-x-reverse))}.-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1rem*var(--tw-space-x-reverse))}.-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1.25rem*var(--tw-space-x-reverse))}.-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1.5rem*var(--tw-space-x-reverse))}.-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1.75rem*var(--tw-space-x-reverse))}.-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-2rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(var(--gray-100),var(--tw-divide-opacity))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(var(--gray-200),var(--tw-divide-opacity))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.justify-self-center{justify-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-x-clip{overflow-x:clip}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b-xl{border-bottom-left-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-x-\[0\.5px\]{border-left-width:.5px;border-right-width:.5px}.border-y{border-bottom-width:1px;border-top-width:1px}.\!border-t-0{border-top-width:0!important}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0}.border-e{border-inline-end-width:1px}.border-s{border-inline-start-width:1px}.border-t{border-top-width:1px}.\!border-none{border-style:none!important}.border-none{border-style:none}.border-gray-100{--tw-border-opacity:1;border-color:rgba(var(--gray-100),var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(var(--gray-200),var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(var(--gray-300),var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgba(var(--gray-600),var(--tw-border-opacity))}.border-primary-500{--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.border-primary-600{--tw-border-opacity:1;border-color:rgba(var(--primary-600),var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-t-gray-200{--tw-border-opacity:1;border-top-color:rgba(var(--gray-200),var(--tw-border-opacity))}.\!bg-gray-50{--tw-bg-opacity:1!important;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))!important}.\!bg-gray-700{--tw-bg-opacity:1!important;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))!important}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-custom-100{--tw-bg-opacity:1;background-color:rgba(var(--c-100),var(--tw-bg-opacity))}.bg-custom-50{--tw-bg-opacity:1;background-color:rgba(var(--c-50),var(--tw-bg-opacity))}.bg-custom-600{--tw-bg-opacity:1;background-color:rgba(var(--c-600),var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(var(--gray-200),var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.bg-gray-950\/50{background-color:rgba(var(--gray-950),.5)}.bg-primary-500{--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-white\/0{background-color:hsla(0,0%,100%,0)}.bg-white\/5{background-color:hsla(0,0%,100%,.05)}.\!bg-none{background-image:none!important}.bg-cover{background-size:cover}.bg-center{background-position:50%}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-3\.5{padding-bottom:.875rem;padding-top:.875rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pe-0{padding-inline-end:0}.pe-1{padding-inline-end:.25rem}.pe-2{padding-inline-end:.5rem}.pe-3{padding-inline-end:.75rem}.pe-4{padding-inline-end:1rem}.pe-6{padding-inline-end:1.5rem}.pe-8{padding-inline-end:2rem}.ps-0{padding-inline-start:0}.ps-1{padding-inline-start:.25rem}.ps-2{padding-inline-start:.5rem}.ps-3{padding-inline-start:.75rem}.ps-4{padding-inline-start:1rem}.ps-\[5\.25rem\]{padding-inline-start:5.25rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.text-start{text-align:start}.text-end{text-align:end}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.font-thin{font-weight:100}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-loose{line-height:2}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.text-custom-400{--tw-text-opacity:1;color:rgba(var(--c-400),var(--tw-text-opacity))}.text-custom-50{--tw-text-opacity:1;color:rgba(var(--c-50),var(--tw-text-opacity))}.text-custom-500{--tw-text-opacity:1;color:rgba(var(--c-500),var(--tw-text-opacity))}.text-custom-600{--tw-text-opacity:1;color:rgba(var(--c-600),var(--tw-text-opacity))}.text-custom-700\/50{color:rgba(var(--c-700),.5)}.text-danger-600{--tw-text-opacity:1;color:rgba(var(--danger-600),var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(var(--gray-100),var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(var(--gray-600),var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.text-gray-700\/50{color:rgba(var(--gray-700),.5)}.text-gray-950{--tw-text-opacity:1;color:rgba(var(--gray-950),var(--tw-text-opacity))}.text-primary-400{--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.text-primary-600{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-sm,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-0{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-1,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-custom-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-600),var(--tw-ring-opacity))}.ring-custom-600\/10{--tw-ring-color:rgba(var(--c-600),0.1)}.ring-custom-600\/20{--tw-ring-color:rgba(var(--c-600),0.2)}.ring-danger-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-600),var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-200),var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-300),var(--tw-ring-opacity))}.ring-gray-600\/10{--tw-ring-color:rgba(var(--gray-600),0.1)}.ring-gray-900\/10{--tw-ring-color:rgba(var(--gray-900),0.1)}.ring-gray-950\/10{--tw-ring-color:rgba(var(--gray-950),0.1)}.ring-gray-950\/5{--tw-ring-color:rgba(var(--gray-950),0.05)}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.ring-white\/10{--tw-ring-color:hsla(0,0%,100%,.1)}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.delay-100{transition-delay:.1s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[transform\:translateZ\(0\)\]{transform:translateZ(0)}.dark\:prose-invert:is(.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.placeholder\:text-gray-400::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.placeholder\:text-gray-400::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-y-0:before{bottom:0;content:var(--tw-content);top:0}.before\:start-0:before{content:var(--tw-content);inset-inline-start:0}.before\:h-full:before{content:var(--tw-content);height:100%}.before\:w-0\.5:before{content:var(--tw-content);width:.125rem}.before\:bg-primary-600:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity));content:var(--tw-content)}.first\:border-s-0:first-child{border-inline-start-width:0}.first\:border-t-0:first-child{border-top-width:0}.last\:border-e-0:last-child{border-inline-end-width:0}.first-of-type\:ps-1:first-of-type{padding-inline-start:.25rem}.last-of-type\:pe-1:last-of-type{padding-inline-end:.25rem}.checked\:ring-0:checked{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.hover\:bg-custom-400\/10:hover{background-color:rgba(var(--c-400),.1)}.hover\:bg-custom-50:hover{--tw-bg-opacity:1;background-color:rgba(var(--c-50),var(--tw-bg-opacity))}.hover\:bg-custom-500:hover{--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.hover\:bg-gray-400\/10:hover{background-color:rgba(var(--gray-400),.1)}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.hover\:text-custom-600:hover{--tw-text-opacity:1;color:rgba(var(--c-600),var(--tw-text-opacity))}.hover\:text-custom-700\/75:hover{color:rgba(var(--c-700),.75)}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.hover\:text-gray-700\/75:hover{color:rgba(var(--gray-700),.75)}.hover\:opacity-100:hover{opacity:1}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-danger-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-600),var(--tw-ring-opacity))}.focus\:ring-primary-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.checked\:focus\:ring-danger-500\/50:focus:checked{--tw-ring-color:rgba(var(--danger-500),0.5)}.checked\:focus\:ring-primary-500\/50:focus:checked{--tw-ring-color:rgba(var(--primary-500),0.5)}.focus-visible\:z-10:focus-visible{z-index:10}.focus-visible\:border-primary-500:focus-visible{--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.focus-visible\:bg-custom-50:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--c-50),var(--tw-bg-opacity))}.focus-visible\:bg-gray-100:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.focus-visible\:bg-gray-50:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.focus-visible\:text-custom-700\/75:focus-visible{color:rgba(var(--c-700),.75)}.focus-visible\:text-gray-500:focus-visible{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.focus-visible\:text-gray-700\/75:focus-visible{color:rgba(var(--gray-700),.75)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset:inset}.focus-visible\:ring-custom-500\/50:focus-visible{--tw-ring-color:rgba(var(--c-500),0.5)}.focus-visible\:ring-custom-600:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-600),var(--tw-ring-opacity))}.focus-visible\:ring-gray-400\/40:focus-visible{--tw-ring-color:rgba(var(--gray-400),0.4)}.focus-visible\:ring-primary-500:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.focus-visible\:ring-primary-600:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.enabled\:cursor-wait:enabled{cursor:wait}.enabled\:opacity-70:enabled{opacity:.7}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:bg-gray-50:disabled{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.disabled\:text-gray-50:disabled{--tw-text-opacity:1;color:rgba(var(--gray-50),var(--tw-text-opacity))}.disabled\:text-gray-500:disabled{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.disabled\:opacity-70:disabled{opacity:.7}.disabled\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled{-webkit-text-fill-color:rgba(var(--gray-500),1)}.disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled::-moz-placeholder{-webkit-text-fill-color:rgba(var(--gray-400),1)}.disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled::placeholder{-webkit-text-fill-color:rgba(var(--gray-400),1)}.disabled\:checked\:bg-current:checked:disabled{background-color:currentColor}.disabled\:checked\:text-gray-400:checked:disabled{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group\/item:first-child .group-first\/item\:rounded-s-lg{border-end-start-radius:.5rem;border-start-start-radius:.5rem}.group\/item:last-child .group-last\/item\:rounded-e-lg{border-end-end-radius:.5rem;border-start-end-radius:.5rem}.group:hover .group-hover\:text-gray-500,.group\/button:hover .group-hover\/button\:text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.group\/item:hover .group-hover\/item\:underline,.group\/link:hover .group-hover\/link\:underline{text-decoration-line:underline}.group:focus-visible .group-focus-visible\:text-gray-500{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.group:focus-visible .group-focus-visible\:text-gray-700{--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.group\/item:focus-visible .group-focus-visible\/item\:underline{text-decoration-line:underline}.group\/link:focus-visible .group-focus-visible\/link\:underline{text-decoration-line:underline}.dark\:flex:is(.dark *){display:flex}.dark\:hidden:is(.dark *){display:none}.dark\:divide-white\/10:is(.dark *)>:not([hidden])~:not([hidden]){border-color:hsla(0,0%,100%,.1)}.dark\:divide-white\/5:is(.dark *)>:not([hidden])~:not([hidden]){border-color:hsla(0,0%,100%,.05)}.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--gray-600),var(--tw-border-opacity))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--gray-700),var(--tw-border-opacity))}.dark\:border-primary-500:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.dark\:border-white\/10:is(.dark *){border-color:hsla(0,0%,100%,.1)}.dark\:border-white\/5:is(.dark *){border-color:hsla(0,0%,100%,.05)}.dark\:border-t-white\/10:is(.dark *){border-top-color:hsla(0,0%,100%,.1)}.dark\:\!bg-gray-700:is(.dark *){--tw-bg-opacity:1!important;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))!important}.dark\:bg-custom-400\/10:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:bg-custom-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}.dark\:bg-custom-500\/20:is(.dark *){background-color:rgba(var(--c-500),.2)}.dark\:bg-gray-400\/10:is(.dark *){background-color:rgba(var(--gray-400),.1)}.dark\:bg-gray-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity))}.dark\:bg-gray-500\/20:is(.dark *){background-color:rgba(var(--gray-500),.2)}.dark\:bg-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-700),var(--tw-bg-opacity))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.dark\:bg-gray-900\/30:is(.dark *){background-color:rgba(var(--gray-900),.3)}.dark\:bg-gray-950:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-950),var(--tw-bg-opacity))}.dark\:bg-gray-950\/75:is(.dark *){background-color:rgba(var(--gray-950),.75)}.dark\:bg-primary-400:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-400),var(--tw-bg-opacity))}.dark\:bg-primary-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.dark\:bg-transparent:is(.dark *){background-color:transparent}.dark\:bg-white\/10:is(.dark *){background-color:hsla(0,0%,100%,.1)}.dark\:bg-white\/5:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:text-custom-300\/50:is(.dark *){color:rgba(var(--c-300),.5)}.dark\:text-custom-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--c-400),var(--tw-text-opacity))}.dark\:text-custom-400\/10:is(.dark *){color:rgba(var(--c-400),.1)}.dark\:text-danger-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--danger-400),var(--tw-text-opacity))}.dark\:text-danger-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--danger-500),var(--tw-text-opacity))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.dark\:text-gray-300\/50:is(.dark *){color:rgba(var(--gray-300),.5)}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:text-gray-700:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-700),var(--tw-text-opacity))}.dark\:text-gray-800:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-800),var(--tw-text-opacity))}.dark\:text-primary-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.dark\:text-primary-500:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark\:text-white\/5:is(.dark *){color:hsla(0,0%,100%,.05)}.dark\:ring-custom-400\/30:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.3)}.dark\:ring-custom-500:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-500),var(--tw-ring-opacity))}.dark\:ring-danger-500:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:ring-gray-400\/20:is(.dark *){--tw-ring-color:rgba(var(--gray-400),0.2)}.dark\:ring-gray-50\/10:is(.dark *){--tw-ring-color:rgba(var(--gray-50),0.1)}.dark\:ring-gray-700:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-700),var(--tw-ring-opacity))}.dark\:ring-gray-900:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-900),var(--tw-ring-opacity))}.dark\:ring-white\/10:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1)}.dark\:ring-white\/20:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2)}.dark\:placeholder\:text-gray-500:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:placeholder\:text-gray-500:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.dark\:before\:bg-primary-500:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity));content:var(--tw-content)}.dark\:checked\:bg-danger-500:checked:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--danger-500),var(--tw-bg-opacity))}.dark\:checked\:bg-primary-500:checked:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity))}.dark\:focus-within\:bg-white\/5:focus-within:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:hover\:bg-custom-400:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-400),var(--tw-bg-opacity))}.dark\:hover\:bg-custom-400\/10:hover:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:hover\:bg-white\/10:hover:is(.dark *){background-color:hsla(0,0%,100%,.1)}.dark\:hover\:bg-white\/5:hover:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:hover\:text-custom-300:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--c-300),var(--tw-text-opacity))}.dark\:hover\:text-custom-300\/75:hover:is(.dark *){color:rgba(var(--c-300),.75)}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.dark\:hover\:text-gray-300\/75:hover:is(.dark *){color:rgba(var(--gray-300),.75)}.dark\:hover\:text-gray-400:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:hover\:ring-white\/20:hover:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2)}.dark\:focus\:ring-danger-500:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:focus\:ring-primary-500:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.dark\:checked\:focus\:ring-danger-400\/50:focus:checked:is(.dark *){--tw-ring-color:rgba(var(--danger-400),0.5)}.dark\:checked\:focus\:ring-primary-400\/50:focus:checked:is(.dark *){--tw-ring-color:rgba(var(--primary-400),0.5)}.dark\:focus-visible\:border-primary-500:focus-visible:is(.dark *){--tw-border-opacity:1;border-color:rgba(var(--primary-500),var(--tw-border-opacity))}.dark\:focus-visible\:bg-custom-400\/10:focus-visible:is(.dark *){background-color:rgba(var(--c-400),.1)}.dark\:focus-visible\:bg-white\/5:focus-visible:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:focus-visible\:text-custom-300\/75:focus-visible:is(.dark *){color:rgba(var(--c-300),.75)}.dark\:focus-visible\:text-gray-300\/75:focus-visible:is(.dark *){color:rgba(var(--gray-300),.75)}.dark\:focus-visible\:text-gray-400:focus-visible:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:focus-visible\:ring-custom-400\/50:focus-visible:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.5)}.dark\:focus-visible\:ring-custom-500:focus-visible:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--c-500),var(--tw-ring-opacity))}.dark\:focus-visible\:ring-primary-500:focus-visible:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.dark\:disabled\:bg-transparent:disabled:is(.dark *){background-color:transparent}.dark\:disabled\:text-gray-400:disabled:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.dark\:disabled\:ring-white\/10:disabled:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1)}.dark\:disabled\:\[-webkit-text-fill-color\:theme\(colors\.gray\.400\)\]:disabled:is(.dark *){-webkit-text-fill-color:rgba(var(--gray-400),1)}.dark\:disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled:is(.dark *)::-moz-placeholder{-webkit-text-fill-color:rgba(var(--gray-500),1)}.dark\:disabled\:placeholder\:\[-webkit-text-fill-color\:theme\(colors\.gray\.500\)\]:disabled:is(.dark *)::placeholder{-webkit-text-fill-color:rgba(var(--gray-500),1)}.dark\:disabled\:checked\:bg-gray-600:checked:disabled:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}.group\/button:hover .dark\:group-hover\/button\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group:hover .dark\:group-hover\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.group:hover .dark\:group-hover\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.group:focus-visible .dark\:group-focus-visible\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-200),var(--tw-text-opacity))}.group:focus-visible .dark\:group-focus-visible\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}@media (min-width:640px){.sm\:relative{position:relative}.sm\:inset-x-auto{left:auto;right:auto}.sm\:end-0{inset-inline-end:0}.sm\:col-\[--col-span-sm\]{grid-column:var(--col-span-sm)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-start-\[--col-start-sm\]{grid-column-start:var(--col-start-sm)}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:-my-2{margin-bottom:-.5rem;margin-top:-.5rem}.sm\:ms-auto{margin-inline-start:auto}.sm\:mt-7{margin-top:1.75rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:table-cell{display:table-cell}.sm\:grid{display:grid}.sm\:inline-grid{display:inline-grid}.sm\:hidden{display:none}.sm\:w-\[calc\(100\%\+3rem\)\]{width:calc(100% + 3rem)}.sm\:w-screen{width:100vw}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-3xl{max-width:48rem}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-5xl{max-width:64rem}.sm\:max-w-6xl{max-width:72rem}.sm\:max-w-7xl{max-width:80rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-md{max-width:28rem}.sm\:max-w-sm{max-width:24rem}.sm\:max-w-xl{max-width:36rem}.sm\:max-w-xs{max-width:20rem}.sm\:columns-\[--cols-sm\]{-moz-columns:var(--cols-sm);columns:var(--cols-sm)}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[--cols-sm\]{grid-template-columns:var(--cols-sm)}.sm\:grid-cols-\[repeat\(auto-fit\2c minmax\(0\2c 1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.sm\:grid-rows-\[1fr_auto_3fr\]{grid-template-rows:1fr auto 3fr}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-1{gap:.25rem}.sm\:gap-3{gap:.75rem}.sm\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.sm\:rounded-xl{border-radius:.75rem}.sm\:p-10{padding:2.5rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.sm\:pe-3{padding-inline-end:.75rem}.sm\:pe-6{padding-inline-end:1.5rem}.sm\:ps-3{padding-inline-start:.75rem}.sm\:ps-6{padding-inline-start:1.5rem}.sm\:pt-1\.5{padding-top:.375rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:leading-6{line-height:1.5rem}.sm\:first-of-type\:ps-3:first-of-type{padding-inline-start:.75rem}.sm\:first-of-type\:ps-6:first-of-type{padding-inline-start:1.5rem}.sm\:last-of-type\:pe-3:last-of-type{padding-inline-end:.75rem}.sm\:last-of-type\:pe-6:last-of-type{padding-inline-end:1.5rem}}@media (min-width:768px){.md\:bottom-4{bottom:1rem}.md\:order-first{order:-9999}.md\:col-\[--col-span-md\]{grid-column:var(--col-span-md)}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-start-\[--col-start-md\]{grid-column-start:var(--col-start-md)}.md\:block{display:block}.md\:flex{display:flex}.md\:table-cell{display:table-cell}.md\:inline-grid{display:inline-grid}.md\:hidden{display:none}.md\:w-max{width:-moz-max-content;width:max-content}.md\:max-w-60{max-width:15rem}.md\:columns-\[--cols-md\]{-moz-columns:var(--cols-md);columns:var(--cols-md)}.md\:grid-flow-col{grid-auto-flow:column}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[--cols-md\]{grid-template-columns:var(--cols-md)}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:gap-1{gap:.25rem}.md\:gap-3{gap:.75rem}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(0px*var(--tw-divide-y-reverse));border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)))}.md\:overflow-x-auto{overflow-x:auto}.md\:rounded-xl{border-radius:.75rem}.md\:p-20{padding:5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:pe-6{padding-inline-end:1.5rem}.md\:ps-3{padding-inline-start:.75rem}}@media (min-width:1024px){.lg\:sticky{position:sticky}.lg\:z-0{z-index:0}.lg\:col-\[--col-span-lg\]{grid-column:var(--col-span-lg)}.lg\:col-start-\[--col-start-lg\]{grid-column-start:var(--col-start-lg)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:table-cell{display:table-cell}.lg\:inline-grid{display:inline-grid}.lg\:hidden{display:none}.lg\:h-full{height:100%}.lg\:max-w-xs{max-width:20rem}.lg\:-translate-x-full{--tw-translate-x:-100%}.lg\:-translate-x-full,.lg\:translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:translate-x-0{--tw-translate-x:0px}.lg\:columns-\[--cols-lg\]{-moz-columns:var(--cols-lg);columns:var(--cols-lg)}.lg\:grid-cols-\[--cols-lg\]{grid-template-columns:var(--cols-lg)}.lg\:flex-row{flex-direction:row}.lg\:items-start{align-items:flex-start}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:gap-1{gap:.25rem}.lg\:gap-3{gap:.75rem}.lg\:bg-transparent{background-color:transparent}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pe-8{padding-inline-end:2rem}.lg\:shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.lg\:shadow-none,.lg\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.lg\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.lg\:transition-none{transition-property:none}.lg\:delay-100{transition-delay:.1s}.dark\:lg\:bg-transparent:is(.dark *){background-color:transparent}}@media (min-width:1280px){.xl\:col-\[--col-span-xl\]{grid-column:var(--col-span-xl)}.xl\:col-start-\[--col-start-xl\]{grid-column-start:var(--col-start-xl)}.xl\:block{display:block}.xl\:table-cell{display:table-cell}.xl\:inline-grid{display:inline-grid}.xl\:hidden{display:none}.xl\:columns-\[--cols-xl\]{-moz-columns:var(--cols-xl);columns:var(--cols-xl)}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[--cols-xl\]{grid-template-columns:var(--cols-xl)}.xl\:flex-row{flex-direction:row}.xl\:items-start{align-items:flex-start}.xl\:items-end{align-items:flex-end}.xl\:items-center{align-items:center}.xl\:gap-1{gap:.25rem}.xl\:gap-3{gap:.75rem}}@media (min-width:1536px){.\32xl\:col-\[--col-span-2xl\]{grid-column:var(--col-span-2xl)}.\32xl\:col-start-\[--col-start-2xl\]{grid-column-start:var(--col-start-2xl)}.\32xl\:block{display:block}.\32xl\:table-cell{display:table-cell}.\32xl\:inline-grid{display:inline-grid}.\32xl\:hidden{display:none}.\32xl\:columns-\[--cols-2xl\]{-moz-columns:var(--cols-2xl);columns:var(--cols-2xl)}.\32xl\:grid-cols-\[--cols-2xl\]{grid-template-columns:var(--cols-2xl)}.\32xl\:flex-row{flex-direction:row}.\32xl\:items-start{align-items:flex-start}.\32xl\:items-end{align-items:flex-end}.\32xl\:items-center{align-items:center}.\32xl\:gap-1{gap:.25rem}.\32xl\:gap-3{gap:.75rem}}.ltr\:hidden:where([dir=ltr],[dir=ltr] *){display:none}.rtl\:hidden:where([dir=rtl],[dir=rtl] *){display:none}.rtl\:-translate-x-0:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-translate-x-5:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:translate-x-1\/2:where([dir=rtl],[dir=rtl] *){--tw-translate-x:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:translate-x-1\/4:where([dir=rtl],[dir=rtl] *){--tw-translate-x:25%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:rotate-180:where([dir=rtl],[dir=rtl] *){--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:flex-row-reverse:where([dir=rtl],[dir=rtl] *){flex-direction:row-reverse}.rtl\:divide-x-reverse:where([dir=rtl],[dir=rtl] *)>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}@media (min-width:1024px){.rtl\:lg\:-translate-x-0:where([dir=rtl],[dir=rtl] *){--tw-translate-x:-0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:lg\:translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}.\[\&\.trix-active\]\:bg-gray-50.trix-active{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.\[\&\.trix-active\]\:text-primary-600.trix-active{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity))}.dark\:\[\&\.trix-active\]\:bg-white\/5.trix-active:is(.dark *){background-color:hsla(0,0%,100%,.05)}.dark\:\[\&\.trix-active\]\:text-primary-400.trix-active:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-400),var(--tw-text-opacity))}.\[\&\:\:-ms-reveal\]\:hidden::-ms-reveal{display:none}.\[\&\:not\(\:first-of-type\)\]\:border-s:not(:first-of-type){border-inline-start-width:1px}.\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-2:focus-within:not(:has(.fi-ac-action:focus)){--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-danger-600:focus-within:not(:has(.fi-ac-action:focus)){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-600),var(--tw-ring-opacity))}.\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-primary-600:focus-within:not(:has(.fi-ac-action:focus)){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.dark\:\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-danger-500:focus-within:not(:has(.fi-ac-action:focus)):is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--danger-500),var(--tw-ring-opacity))}.dark\:\[\&\:not\(\:has\(\.fi-ac-action\:focus\)\)\]\:focus-within\:ring-primary-500:focus-within:not(:has(.fi-ac-action:focus)):is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-500),var(--tw-ring-opacity))}.\[\&\:not\(\:last-of-type\)\]\:border-e:not(:last-of-type){border-inline-end-width:1px}.\[\&\:not\(\:nth-child\(1_of_\.fi-btn\)\)\]\:shadow-\[-1px_0_0_0_theme\(colors\.gray\.200\)\]:not(:nth-child(1 of .fi-btn)){--tw-shadow:-1px 0 0 0 rgba(var(--gray-200),1);--tw-shadow-colored:-1px 0 0 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dark\:\[\&\:not\(\:nth-child\(1_of_\.fi-btn\)\)\]\:shadow-\[-1px_0_0_0_theme\(colors\.white\/20\%\)\]:not(:nth-child(1 of .fi-btn)):is(.dark *){--tw-shadow:-1px 0 0 0 hsla(0,0%,100%,.2);--tw-shadow-colored:-1px 0 0 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\[\&\:not\(\:nth-last-child\(1_of_\.fi-btn\)\)\]\:me-px:not(:nth-last-child(1 of .fi-btn)){margin-inline-end:1px}.\[\&\:nth-child\(1_of_\.fi-btn\)\]\:rounded-s-lg:nth-child(1 of .fi-btn){border-end-start-radius:.5rem;border-start-start-radius:.5rem}.\[\&\:nth-last-child\(1_of_\.fi-btn\)\]\:rounded-e-lg:nth-last-child(1 of .fi-btn){border-end-end-radius:.5rem;border-start-end-radius:.5rem}.\[\&\>\*\:first-child\]\:relative>:first-child{position:relative}.\[\&\>\*\:first-child\]\:mt-0>:first-child{margin-top:0}.\[\&\>\*\:first-child\]\:before\:absolute>:first-child:before{content:var(--tw-content);position:absolute}.\[\&\>\*\:first-child\]\:before\:inset-y-0>:first-child:before{bottom:0;content:var(--tw-content);top:0}.\[\&\>\*\:first-child\]\:before\:start-0>:first-child:before{content:var(--tw-content);inset-inline-start:0}.\[\&\>\*\:first-child\]\:before\:w-0\.5>:first-child:before{content:var(--tw-content);width:.125rem}.\[\&\>\*\:first-child\]\:before\:bg-primary-600>:first-child:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity));content:var(--tw-content)}.\[\&\>\*\:first-child\]\:dark\:before\:bg-primary-500:is(.dark *)>:first-child:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-500),var(--tw-bg-opacity));content:var(--tw-content)}.\[\&\>\*\:last-child\]\:mb-0>:last-child{margin-bottom:0}.\[\&_\.choices\\_\\_inner\]\:ps-0 .choices__inner{padding-inline-start:0}.\[\&_\.fi-badge-delete-button\]\:hidden .fi-badge-delete-button{display:none}.\[\&_\.filepond--root\]\:font-sans .filepond--root{font-family:var(--font-family),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.\[\&_optgroup\]\:bg-white optgroup{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.\[\&_optgroup\]\:dark\:bg-gray-900:is(.dark *) optgroup{--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.\[\&_option\]\:bg-white option{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.\[\&_option\]\:dark\:bg-gray-900:is(.dark *) option{--tw-bg-opacity:1;background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}:checked+*>.\[\:checked\+\*\>\&\]\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}@media(hover:hover){.\[\@media\(hover\:hover\)\]\:transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.\[\@media\(hover\:hover\)\]\:duration-75{transition-duration:75ms}}input:checked+.\[input\:checked\+\&\]\:bg-custom-600{--tw-bg-opacity:1;background-color:rgba(var(--c-600),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}input:checked+.\[input\:checked\+\&\]\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}input:checked+.\[input\:checked\+\&\]\:hover\:bg-custom-500:hover{--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}input:checked+.\[input\:checked\+\&\]\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:bg-custom-500:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-500),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:bg-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-600),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:hover\:bg-custom-400:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--c-400),var(--tw-bg-opacity))}input:checked+.dark\:\[input\:checked\+\&\]\:hover\:bg-gray-500:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity))}input:checked:focus-visible+.\[input\:checked\:focus-visible\+\&\]\:ring-custom-500\/50{--tw-ring-color:rgba(var(--c-500),0.5)}input:checked:focus-visible+.dark\:\[input\:checked\:focus-visible\+\&\]\:ring-custom-400\/50:is(.dark *){--tw-ring-color:rgba(var(--c-400),0.5)}input:focus-visible+.\[input\:focus-visible\+\&\]\:z-10{z-index:10}input:focus-visible+.\[input\:focus-visible\+\&\]\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}input:focus-visible+.\[input\:focus-visible\+\&\]\:ring-gray-950\/10{--tw-ring-color:rgba(var(--gray-950),0.1)}input:focus-visible+.dark\:\[input\:focus-visible\+\&\]\:ring-white\/20:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2)} \ No newline at end of file diff --git a/public/css/filament/forms/forms.css b/public/css/filament/forms/forms.css index 5c29a13..642acfd 100644 --- a/public/css/filament/forms/forms.css +++ b/public/css/filament/forms/forms.css @@ -1,4 +1,4 @@ -input::-webkit-datetime-edit{display:block;padding:0}.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{inset:0;position:absolute}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.filepond--assistant{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--browser.filepond--browser{font-size:0;left:1em;margin:0;opacity:0;padding:0;position:absolute;top:1.75em;width:calc(100% - 2em)}.filepond--data{border:none;contain:strict;height:0;margin:0;padding:0;visibility:hidden;width:0}.filepond--data,.filepond--drip{pointer-events:none;position:absolute}.filepond--drip{background:rgba(0,0,0,.01);border-radius:.5em;inset:0;opacity:.1;overflow:hidden}.filepond--drip-blob{background:#292625;border-radius:50%;height:8em;margin-left:-4em;margin-top:-4em;transform-origin:center center;width:8em}.filepond--drip-blob,.filepond--drop-label{left:0;position:absolute;top:0;will-change:transform,opacity}.filepond--drop-label{align-items:center;color:#4f4f4f;display:flex;height:0;justify-content:center;margin:0;right:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--drop-label.filepond--drop-label label{display:block;margin:0;padding:.5em}.filepond--drop-label label{cursor:default;font-size:.875em;font-weight:400;line-height:1.5;text-align:center}.filepond--label-action{-webkit-text-decoration-skip:ink;cursor:pointer;text-decoration:underline;text-decoration-color:#a7a4a4;text-decoration-skip-ink:auto}.filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.filepond--file-action-button.filepond--file-action-button{border:none;font-family:inherit;font-size:1em;height:1.625em;line-height:inherit;margin:0;outline:none;padding:0;width:1.625em;will-change:transform,opacity}.filepond--file-action-button.filepond--file-action-button span{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file-action-button.filepond--file-action-button svg{height:100%;width:100%}.filepond--file-action-button.filepond--file-action-button:after{content:"";inset:-.75em;position:absolute}.filepond--file-action-button{background-color:#00000080;background-image:none;border-radius:50%;box-shadow:0 0 #fff0;color:#fff;cursor:auto;transition:box-shadow .25s ease-in}.filepond--file-action-button:focus,.filepond--file-action-button:hover{box-shadow:0 0 0 .125em #ffffffe6}.filepond--file-action-button[disabled]{background-color:#00000040;color:#ffffff80}.filepond--file-action-button[hidden]{display:none}.filepond--file-info{align-items:flex-start;display:flex;flex:1;flex-direction:column;margin:0 .5em 0 0;min-width:0;pointer-events:none;position:static;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-info *{margin:0}.filepond--file-info .filepond--file-info-main{font-size:.75em;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.filepond--file-info .filepond--file-info-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out;white-space:nowrap}.filepond--file-info .filepond--file-info-sub:empty{display:none}.filepond--file-status{align-items:flex-end;display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;margin:0;min-width:2.25em;pointer-events:none;position:static;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-status *{margin:0;white-space:nowrap}.filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.filepond--file-status .filepond--file-status-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out}.filepond--file-wrapper.filepond--file-wrapper{border:none;height:100%;margin:0;min-width:0;padding:0}.filepond--file-wrapper.filepond--file-wrapper>legend{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file{align-items:flex-start;border-radius:.5em;color:#fff;display:flex;height:100%;padding:.5625em;position:static}.filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.filepond--file .filepond--file-action-button,.filepond--file .filepond--processing-complete-indicator,.filepond--file .filepond--progress-indicator{position:absolute}.filepond--file [data-align*=left]{left:.5625em}.filepond--file [data-align*=right]{right:.5625em}.filepond--file [data-align*=center]{left:calc(50% - .8125em)}.filepond--file [data-align*=bottom]{bottom:1.125em}.filepond--file [data-align=center]{top:calc(50% - .8125em)}.filepond--file .filepond--progress-indicator{margin-top:.1875em}.filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}[data-filepond-item-state*=error] .filepond--file-info,[data-filepond-item-state*=invalid] .filepond--file-info,[data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}[data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}[data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{animation:fall .5s linear .125s both}[data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--file-info-sub,[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}[data-filepond-item-state*=error] .filepond--file-wrapper,[data-filepond-item-state*=error] .filepond--panel,[data-filepond-item-state*=invalid] .filepond--file-wrapper,[data-filepond-item-state*=invalid] .filepond--panel{animation:shake .65s linear both}[data-filepond-item-state*=busy] .filepond--progress-indicator svg{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes shake{10%,90%{transform:translate(-.0625em)}20%,80%{transform:translate(.125em)}30%,50%,70%{transform:translate(-.25em)}40%,60%{transform:translate(.25em)}}@keyframes fall{0%{animation-timing-function:ease-out;opacity:0;transform:scale(.5)}70%{animation-timing-function:ease-in-out;opacity:1;transform:scale(1.1)}to{animation-timing-function:ease-out;transform:scale(1)}}.filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.filepond--hopper[data-hopper-state=drag-over]:after{content:"";inset:0;position:absolute;z-index:100}.filepond--progress-indicator{z-index:103}.filepond--file-action-button{z-index:102}.filepond--file-status{z-index:101}.filepond--file-info{z-index:100}.filepond--item{left:0;margin:.25em;padding:0;position:absolute;right:0;top:0;touch-action:none;will-change:transform,opacity;z-index:1}.filepond--item>.filepond--panel{z-index:-1}.filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em #00000040}.filepond--item>.filepond--file-wrapper,.filepond--item>.filepond--panel{transition:opacity .15s ease-out}.filepond--item[data-drag-state]{cursor:grab}.filepond--item[data-drag-state]>.filepond--panel{box-shadow:0 0 0 transparent;transition:box-shadow .125s ease-in-out}.filepond--item[data-drag-state=drag]{cursor:grabbing}.filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em #00000053}.filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.filepond--item-panel{background-color:#64605e}[data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}[data-filepond-item-state*=error] .filepond--item-panel,[data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.filepond--item-panel{border-radius:.5em;transition:background-color .25s}.filepond--list-scroller{left:0;margin:0;position:absolute;right:0;top:0;will-change:transform}.filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.filepond--list-scroller[data-state=overflow]{-webkit-overflow-scrolling:touch;-webkit-mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);overflow-x:hidden;overflow-y:scroll}.filepond--list-scroller::-webkit-scrollbar{background:transparent}.filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.filepond--list-scroller::-webkit-scrollbar-thumb{background-clip:content-box;background-color:#0000004d;border:.3125em solid transparent;border-radius:99999px}.filepond--list.filepond--list{list-style-type:none;margin:0;padding:0;position:absolute;top:0;will-change:transform}.filepond--list{left:.75em;right:.75em}.filepond--root[data-style-panel-layout~=integrated]{height:100%;margin:0;max-width:none;width:100%}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{align-items:center;bottom:0;display:flex;height:auto;justify-content:center;z-index:7}.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{height:100%;margin-bottom:0;margin-top:0;overflow:hidden}.filepond--root[data-style-panel-layout~=compact] .filepond--list,.filepond--root[data-style-panel-layout~=integrated] .filepond--list{height:100%;left:0;right:0}.filepond--root[data-style-panel-layout~=compact] .filepond--item,.filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.filepond--root[data-style-panel-layout~=circle] .filepond--file-status,.filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*{display:none}@media not all and (-webkit-min-device-pixel-ratio:0),not all and (min-resolution:.001dpcm){@supports (-webkit-appearance:none) and (stroke-color:transparent){.filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.filepond--panel-root{background-color:#f1f0ef;border-radius:.5em}.filepond--panel{height:100%!important;left:0;margin:0;pointer-events:none;position:absolute;right:0;top:0}.filepond-panel:not([data-scalable=false]){height:auto!important}.filepond--panel[data-scalable=false]>div{display:none}.filepond--panel[data-scalable=true]{background-color:transparent!important;border:none!important;transform-style:preserve-3d}.filepond--panel-bottom,.filepond--panel-center,.filepond--panel-top{left:0;margin:0;padding:0;position:absolute;right:0;top:0}.filepond--panel-bottom,.filepond--panel-top{height:.5em}.filepond--panel-top{border-bottom:none!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.filepond--panel-top:after{background-color:inherit;bottom:-1px;content:"";height:2px;left:0;position:absolute;right:0}.filepond--panel-bottom,.filepond--panel-center{backface-visibility:hidden;transform:translate3d(0,.5em,0);transform-origin:left top;will-change:transform}.filepond--panel-bottom{border-top:none!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.filepond--panel-bottom:before{background-color:inherit;content:"";height:2px;left:0;position:absolute;right:0;top:-1px}.filepond--panel-center{border-bottom:none!important;border-radius:0!important;border-top:none!important;height:100px!important}.filepond--panel-center:not([style]){visibility:hidden}.filepond--progress-indicator{color:#fff;height:1.25em;margin:0;pointer-events:none;position:static;width:1.25em;will-change:transform,opacity}.filepond--progress-indicator svg{height:100%;transform-box:fill-box;vertical-align:top;width:100%}.filepond--progress-indicator path{fill:none;stroke:currentColor}.filepond--list-scroller{z-index:6}.filepond--drop-label{z-index:5}.filepond--drip{z-index:3}.filepond--root>.filepond--panel{z-index:2}.filepond--browser{z-index:1}.filepond--root{box-sizing:border-box;contain:layout style size;direction:ltr;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:450;line-height:normal;margin-bottom:1em;position:relative;text-align:left;text-rendering:optimizeLegibility}.filepond--root *{box-sizing:inherit;line-height:inherit}.filepond--root :not(text){font-size:inherit}.filepond--root[data-disabled]{pointer-events:none}.filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.filepond--root[data-disabled] .filepond--list{pointer-events:none}.filepond--root .filepond--drop-label{min-height:4.75em}.filepond--root .filepond--list-scroller{margin-bottom:1em;margin-top:1em}.filepond--root .filepond--credits{bottom:-14px;color:inherit;font-size:11px;line-height:.85;opacity:.175;position:absolute;right:0;text-decoration:none;z-index:3}.filepond--root .filepond--credits[style]{bottom:auto;margin-top:14px;top:0}.filepond--action-edit-item.filepond--action-edit-item{height:2em;padding:.1875em;width:2em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.filepond--action-edit-item-alt{background:transparent;border:none;color:inherit;font-family:inherit;line-height:inherit;margin:0 0 0 .25em;outline:none;padding:0;pointer-events:all;position:absolute}.filepond--action-edit-item-alt svg{height:1.3125em;width:1.3125em}.filepond--action-edit-item-alt span{font-size:0;opacity:0}.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}.filepond--image-preview-markup{left:0;position:absolute;top:0}.filepond--image-preview-wrapper{z-index:2}.filepond--image-preview-overlay{display:block;left:0;margin:0;max-height:7rem;min-height:5rem;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.filepond--image-preview-overlay svg{color:inherit;height:auto;max-height:inherit;width:100%}.filepond--image-preview-overlay-idle{color:#282828d9;mix-blend-mode:multiply}.filepond--image-preview-overlay-success{color:#369763;mix-blend-mode:normal}.filepond--image-preview-overlay-failure{color:#c44e47;mix-blend-mode:normal}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.filepond--image-preview-wrapper{background:rgba(0,0,0,.01);border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--image-preview{align-items:center;background:#222;display:flex;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;will-change:transform,opacity;z-index:1}.filepond--image-clip{margin:0 auto;overflow:hidden;position:relative}.filepond--image-clip[data-transparency-indicator=grid] canvas,.filepond--image-clip[data-transparency-indicator=grid] img{background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0h50v50H0M50 50h50v50H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.filepond--image-bitmap,.filepond--image-vector{left:0;position:absolute;top:0;will-change:transform}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{align-items:center;display:flex;height:100%;justify-content:center}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{bottom:0;top:auto;transform:scaleY(-1)}.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-bottom:.1875em;margin-left:.1875em;margin-top:0}.filepond--media-preview audio{display:none}.filepond--media-preview .audioplayer{margin:2.3em auto auto;width:calc(100% - 1.4em)}.filepond--media-preview .playpausebtn{background-position:50%;background-repeat:no-repeat;border:none;border-radius:25px;cursor:pointer;float:left;height:25px;margin-right:.3em;margin-top:.3em;outline:none;width:25px}.filepond--media-preview .playpausebtn:hover{background-color:#00000080}.filepond--media-preview .play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyElEQVQ4T9XUsWoCQRRG4XPaFL5SfIy8gKYKBCysrax8Ahs7qzQ2qVIFOwsrsbEWLEK6EBFGBrIQhN2d3dnGgalm+Jh7789Ix8uOPe4YDCH0gZ66atKW0pJDCE/AEngDXtRjCpwCRucbGANzNVTBqWBhfAJDdV+GNgWj8wtM41bPt3AbsDB2f69d/0dzwC0wUDe54A8wAWbqJbfkD+BZPeQO5QsYqYu6LKb0MIb7VT3VYfG8CnwEHtT3FKi4c8e/TZMyk3LYFrwCgMdHFbRDKS8AAAAASUVORK5CYII=)}.filepond--media-preview .pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAh0lEQVQ4T+2UsQkCURBE30PLMbAMMResQrAPsQ0TK9AqDKxGZeTLD74aGNwlhzfZssvADDMrPcOe+RggYZIJcG2s2KinMidZAvu6u6uzT8u+JCeZArfmcKUeK+EaONTdQy23bxgJX8aPHvIHsSnVuzTx36rn2pQFsGuqN//ZlK7vbIDvq6vkJ9yteBXzecYbAAAAAElFTkSuQmCC)}.filepond--media-preview .timeline{background:hsla(0,0%,100%,.3);border-radius:15px;float:left;height:3px;margin-top:1em;width:calc(100% - 2.5em)}.filepond--media-preview .playhead{background:#fff;border-radius:50%;height:13px;margin-top:-5px;width:13px}.filepond--media-preview-wrapper{background:rgba(0,0,0,.01);border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;pointer-events:auto;position:absolute;right:0;top:0}.filepond--media-preview-wrapper:before{background:linear-gradient(180deg,#000 0,transparent);content:" ";filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#000000",endColorstr="#00000000",GradientType=0);height:2em;position:absolute;width:100%;z-index:3}.filepond--media-preview{display:block;height:100%;position:relative;transform-origin:center center;width:100%;will-change:transform,opacity;z-index:1}.filepond--media-preview audio,.filepond--media-preview video{width:100%;will-change:transform}.filepond--root{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);margin-bottom:0}.filepond--root:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2);background-color:hsla(0,0%,100%,.05)}.filepond--root[data-disabled=disabled]{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.filepond--root[data-disabled=disabled]:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1);background-color:transparent}.filepond--panel-root{background-color:transparent}.filepond--drop-label label{--tw-text-opacity:1;color:rgba(var(--gray-600),var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem;padding:.75rem!important}.filepond--drop-label label:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.filepond--label-action{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity));font-weight:500;text-decoration-line:none;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.filepond--label-action:hover{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.filepond--label-action:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.filepond--label-action:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.filepond--drip-blob{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity))}.filepond--drip-blob:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity))}.filepond--root[data-style-panel-layout=grid] .filepond--item{display:inline;width:calc(50% - .5rem)}@media (min-width:1024px){.filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(33.33% - .5rem)}}.filepond--download-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--download-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--download-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--open-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--open-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--open-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--file-action-button.filepond--action-edit-item{background-color:rgba(0,0,0,.5)}.cropper-drag-box.cropper-crop.cropper-modal{background-color:rgba(var(--gray-100),.5);opacity:1}.cropper-drag-box.cropper-crop.cropper-modal:is(.dark *){background-color:rgba(var(--gray-900),.8)}.fi-fo-file-upload-circle-cropper .cropper-face,.fi-fo-file-upload-circle-cropper .cropper-view-box{border-radius:50%}.CodeMirror{color:#000;direction:ltr;font-family:monospace;height:300px}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{background-color:#f7f7f7;border-right:1px solid #ddd;white-space:nowrap}.CodeMirror-linenumber{color:#999;min-width:20px;padding:0 3px 0 5px;text-align:right;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{background:#7e7;border:0!important;width:auto}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.cm-fat-cursor{caret-color:transparent}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{inset:-50px 0 0;overflow:hidden;position:absolute}.CodeMirror-ruler{border-left:1px solid #ccc;bottom:0;position:absolute;top:0}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{background:#fff;overflow:hidden;position:relative}.CodeMirror-scroll{height:100%;margin-bottom:-50px;margin-right:-50px;outline:0;overflow:scroll!important;padding-bottom:50px;position:relative;z-index:0}.CodeMirror-sizer{border-right:50px solid transparent;position:relative}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{display:none;outline:0;position:absolute;z-index:6}.CodeMirror-vscrollbar{overflow-x:hidden;overflow-y:scroll;right:0;top:0}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-x:scroll;overflow-y:hidden}.CodeMirror-scrollbar-filler{bottom:0;right:0}.CodeMirror-gutter-filler{bottom:0;left:0}.CodeMirror-gutters{left:0;min-height:100%;position:absolute;top:0;z-index:3}.CodeMirror-gutter{display:inline-block;height:100%;margin-bottom:-50px;vertical-align:top;white-space:normal}.CodeMirror-gutter-wrapper{background:0 0!important;border:none!important;position:absolute;z-index:4}.CodeMirror-gutter-background{bottom:0;position:absolute;top:0;z-index:4}.CodeMirror-gutter-elt{cursor:default;position:absolute;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{word-wrap:normal;-webkit-tap-highlight-color:transparent;background:0 0;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-variant-ligatures:contextual;line-height:inherit;margin:0;overflow:visible;position:relative;white-space:pre;z-index:2}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{inset:0;position:absolute;z-index:0}.CodeMirror-linewidget{padding:.1px;position:relative;z-index:2}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{height:0;overflow:hidden;position:absolute;visibility:hidden;width:100%}.CodeMirror-cursor{pointer-events:none;position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{position:relative;visibility:hidden;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:0 0}.EasyMDEContainer{display:block}.CodeMirror-rtl pre{direction:rtl}.EasyMDEContainer.sided--no-fullscreen{display:flex;flex-direction:row;flex-wrap:wrap}.EasyMDEContainer .CodeMirror{word-wrap:break-word;border:1px solid #ced4da;border-bottom-left-radius:4px;border-bottom-right-radius:4px;box-sizing:border-box;font:inherit;height:auto;padding:10px;z-index:0}.EasyMDEContainer .CodeMirror-scroll{cursor:text}.EasyMDEContainer .CodeMirror-fullscreen{background:#fff;border-bottom-right-radius:0!important;border-right:none!important;height:auto;inset:50px 0 0;position:fixed!important;z-index:8}.EasyMDEContainer .CodeMirror-sided{width:50%!important}.EasyMDEContainer.sided--no-fullscreen .CodeMirror-sided{border-bottom-right-radius:0;border-right:none!important;flex:1 1 auto;position:relative}.EasyMDEContainer .CodeMirror-placeholder{opacity:.5}.EasyMDEContainer .CodeMirror-focused .CodeMirror-selected{background:#d9d9d9}.editor-toolbar{border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-top:1px solid #ced4da;border-top-left-radius:4px;border-top-right-radius:4px;padding:9px 10px;position:relative;-webkit-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.editor-toolbar.fullscreen{background:#fff;border:0;box-sizing:border-box;height:50px;left:0;opacity:1;padding-bottom:10px;padding-top:10px;position:fixed;top:0;width:100%;z-index:9}.editor-toolbar.fullscreen:before{background:linear-gradient(90deg,#fff 0,hsla(0,0%,100%,0));height:50px;left:0;margin:0;padding:0;position:fixed;top:0;width:20px}.editor-toolbar.fullscreen:after{background:linear-gradient(90deg,hsla(0,0%,100%,0) 0,#fff);height:50px;margin:0;padding:0;position:fixed;right:0;top:0;width:20px}.EasyMDEContainer.sided--no-fullscreen .editor-toolbar{width:100%}.editor-toolbar .easymde-dropdown,.editor-toolbar button{background:0 0;border:1px solid transparent;border-radius:3px;cursor:pointer;display:inline-block;height:30px;margin:0;padding:0;text-align:center;text-decoration:none!important}.editor-toolbar button{font-weight:700;min-width:30px;padding:0 6px;white-space:nowrap}.editor-toolbar button.active,.editor-toolbar button:hover{background:#fcfcfc;border-color:#95a5a6}.editor-toolbar i.separator{border-left:1px solid #d9d9d9;border-right:1px solid #fff;color:transparent;display:inline-block;margin:0 6px;text-indent:-10px;width:0}.editor-toolbar button:after{font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:65%;position:relative;top:2px;vertical-align:text-bottom}.editor-toolbar button.heading-1:after{content:"1"}.editor-toolbar button.heading-2:after{content:"2"}.editor-toolbar button.heading-3:after{content:"3"}.editor-toolbar button.heading-bigger:after{content:"\25b2"}.editor-toolbar button.heading-smaller:after{content:"\25bc"}.editor-toolbar.disabled-for-preview button:not(.no-disable){opacity:.6;pointer-events:none}@media only screen and (max-width:700px){.editor-toolbar i.no-mobile{display:none}}.editor-statusbar{color:#959694;font-size:12px;padding:8px 10px;text-align:right}.EasyMDEContainer.sided--no-fullscreen .editor-statusbar{width:100%}.editor-statusbar span{display:inline-block;margin-left:1em;min-width:4em}.editor-statusbar .lines:before{content:"lines: "}.editor-statusbar .words:before{content:"words: "}.editor-statusbar .characters:before{content:"characters: "}.editor-preview-full{height:100%;left:0;position:absolute;top:0;width:100%;z-index:7}.editor-preview-full,.editor-preview-side{box-sizing:border-box;display:none;overflow:auto}.editor-preview-side{word-wrap:break-word;border:1px solid #ddd;bottom:0;position:fixed;right:0;top:50px;width:50%;z-index:9}.editor-preview-active-side{display:block}.EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side{flex:1 1 auto;height:auto;position:static}.editor-preview-active{display:block}.editor-preview{background:#fafafa;padding:10px}.editor-preview>p{margin-top:0}.editor-preview pre{background:#eee;margin-bottom:10px}.editor-preview table td,.editor-preview table th{border:1px solid #ddd;padding:5px}.cm-s-easymde .cm-tag{color:#63a35c}.cm-s-easymde .cm-attribute{color:#795da3}.cm-s-easymde .cm-string{color:#183691}.cm-s-easymde .cm-header-1{font-size:calc(1.375rem + 1.5vw)}.cm-s-easymde .cm-header-2{font-size:calc(1.325rem + .9vw)}.cm-s-easymde .cm-header-3{font-size:calc(1.3rem + .6vw)}.cm-s-easymde .cm-header-4{font-size:calc(1.275rem + .3vw)}.cm-s-easymde .cm-header-5{font-size:1.25rem}.cm-s-easymde .cm-header-6{font-size:1rem}.cm-s-easymde .cm-header-1,.cm-s-easymde .cm-header-2,.cm-s-easymde .cm-header-3,.cm-s-easymde .cm-header-4,.cm-s-easymde .cm-header-5,.cm-s-easymde .cm-header-6{line-height:1.2;margin-bottom:.5rem}.cm-s-easymde .cm-comment{background:rgba(0,0,0,.05);border-radius:2px}.cm-s-easymde .cm-link{color:#7f8c8d}.cm-s-easymde .cm-url{color:#aab2b3}.cm-s-easymde .cm-quote{color:#7f8c8d;font-style:italic}.editor-toolbar .easymde-dropdown{border:1px solid #fff;border-radius:0;position:relative}.editor-toolbar .easymde-dropdown,.editor-toolbar .easymde-dropdown:hover{background:linear-gradient(to bottom right,#fff,#fff 84%,#333 0,#333)}.easymde-dropdown-content{background-color:#f9f9f9;box-shadow:0 8px 16px #0003;display:block;padding:8px;position:absolute;top:30px;visibility:hidden;z-index:2}.easymde-dropdown:active .easymde-dropdown-content,.easymde-dropdown:focus .easymde-dropdown-content,.easymde-dropdown:focus-within .easymde-dropdown-content{visibility:visible}.easymde-dropdown-content button{display:block}span[data-img-src]:after{background-image:var(--bg-image);background-repeat:no-repeat;background-size:contain;content:"";display:block;height:0;max-height:100%;max-width:100%;padding-top:var(--height);width:var(--width)}.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:rgba(255,0,0,.15)}:root{--color-cm-red:#991b1b;--color-cm-orange:#9a3412;--color-cm-amber:#92400e;--color-cm-yellow:#854d0e;--color-cm-lime:#3f6212;--color-cm-green:#166534;--color-cm-emerald:#065f46;--color-cm-teal:#115e59;--color-cm-cyan:#155e75;--color-cm-sky:#075985;--color-cm-blue:#1e40af;--color-cm-indigo:#3730a3;--color-cm-violet:#5b21b6;--color-cm-purple:#6b21a8;--color-cm-fuchsia:#86198f;--color-cm-pink:#9d174d;--color-cm-rose:#9f1239;--color-cm-gray:#18181b;--color-cm-gray-muted:#71717a;--color-cm-gray-background:#e4e4e7}.dark{--color-cm-red:#f87171;--color-cm-orange:#fb923c;--color-cm-amber:#fbbf24;--color-cm-yellow:#facc15;--color-cm-lime:#a3e635;--color-cm-green:#4ade80;--color-cm-emerald:#4ade80;--color-cm-teal:#2dd4bf;--color-cm-cyan:#22d3ee;--color-cm-sky:#38bdf8;--color-cm-blue:#60a5fa;--color-cm-indigo:#818cf8;--color-cm-violet:#a78bfa;--color-cm-purple:#c084fc;--color-cm-fuchsia:#e879f9;--color-cm-pink:#f472b6;--color-cm-rose:#fb7185;--color-cm-gray:#fafafa;--color-cm-gray-muted:#a1a1aa;--color-cm-gray-background:#52525b}.cm-s-easymde .cm-comment{background-color:transparent;color:var(--color-cm-gray-muted)}.EasyMDEContainer .CodeMirror-cursor{border-color:currentColor}.dark .EasyMDEContainer .cm-s-easymde span.CodeMirror-selectedtext{filter:invert(100%)}.EasyMDEContainer .cm-s-easymde .cm-keyword{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-atom{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-number{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-def{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable{color:var(--color-cm-yellow)}.EasyMDEContainer .cm-s-easymde .cm-variable-2{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable-3{color:var(--color-cm-emerald)}.EasyMDEContainer .cm-s-easymde .cm-operator,.EasyMDEContainer .cm-s-easymde .cm-property{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-string,.EasyMDEContainer .cm-s-easymde .cm-string-2{color:var(--color-cm-rose)}.EasyMDEContainer .cm-s-easymde .cm-meta{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-error{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-qualifier{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-builtin{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-bracket{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-hr{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote{color:var(--color-cm-sky)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote+.cm-quote{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-list,.EasyMDEContainer .cm-s-easymde .cm-formatting-list+.cm-variable-2,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-variable-2{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-link{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-amber)}.EasyMDEContainer .cm-s-easymde .cm-attribute+.cm-string{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-formatting-code+.cm-comment:not(.cm-formatting-code){background-color:var(--color-cm-gray-background);color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-header-1{font-size:1.875rem;line-height:2.25rem}.EasyMDEContainer .cm-s-easymde .cm-header-2{font-size:1.5rem;line-height:2rem}.EasyMDEContainer .cm-s-easymde .cm-header-3{font-size:1.25rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-4{font-size:1.125rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-5{font-size:1rem;line-height:1.5rem}.EasyMDEContainer .cm-s-easymde .cm-header-6{font-size:.875rem;line-height:1.25rem}.EasyMDEContainer .cm-s-easymde .cm-comment{background-image:none}.EasyMDEContainer .CodeMirror,.EasyMDEContainer .cm-s-easymde .cm-formatting-code-block,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-comment{background-color:transparent;color:inherit}.EasyMDEContainer .CodeMirror{border-style:none;padding:.375rem .75rem}.EasyMDEContainer .CodeMirror-scroll{height:auto}.EasyMDEContainer .editor-toolbar{--tw-border-opacity:1;border-color:rgba(var(--gray-200),var(--tw-border-opacity));border-radius:0;border-width:0 0 1px;-moz-column-gap:.25rem;column-gap:.25rem;display:flex;overflow-x:auto;padding:.5rem .625rem}.EasyMDEContainer .editor-toolbar:is(.dark *){border-color:hsla(0,0%,100%,.1)}.EasyMDEContainer .editor-toolbar button{border-radius:.5rem;border-style:none;cursor:pointer;display:grid;height:2rem;padding:0;place-content:center;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}.EasyMDEContainer .editor-toolbar button:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button:hover:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:focus-visible:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button.active{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:before{--tw-bg-opacity:1;background-color:rgba(var(--gray-700),var(--tw-bg-opacity));display:block;height:1rem;width:1rem}.EasyMDEContainer .editor-toolbar button:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button:before{content:"";-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.EasyMDEContainer .editor-toolbar button.active:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--primary-400),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar .separator{border-style:none;margin:0!important;width:.25rem}.EasyMDEContainer .editor-toolbar .bold:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath d='M321.1 242.4c19-22.3 30.9-50.8 30.9-82.4 0-70.59-57.42-128-128-128l-192 .01c-17.67 0-32 14.31-32 32s14.33 32 32 32h16v320H32c-17.67 0-32 14.31-32 32s14.33 32 32 32h224c70.58 0 128-57.41 128-128 0-46.71-25.4-87.21-62.9-109.61zM112 96.01h112c35.3 0 64 28.72 64 64s-28.7 64-64 64H112v-128zM256 416H112V288h144c35.3 0 64 28.71 64 63.1S291.3 416 256 416z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath d='M321.1 242.4c19-22.3 30.9-50.8 30.9-82.4 0-70.59-57.42-128-128-128l-192 .01c-17.67 0-32 14.31-32 32s14.33 32 32 32h16v320H32c-17.67 0-32 14.31-32 32s14.33 32 32 32h224c70.58 0 128-57.41 128-128 0-46.71-25.4-87.21-62.9-109.61zM112 96.01h112c35.3 0 64 28.72 64 64s-28.7 64-64 64H112v-128zM256 416H112V288h144c35.3 0 64 28.71 64 63.1S291.3 416 256 416z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .italic:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath d='M384 64.01c0 17.69-14.31 32-32 32h-58.67l-133.3 320H224c17.69 0 32 14.31 32 32s-14.31 32-32 32H32c-17.69 0-32-14.31-32-32s14.31-32 32-32h58.67l133.3-320H160c-17.69 0-32-14.31-32-32s14.31-32 32-32h192c17.7 0 32 14.32 32 32z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 384 512'%3E%3Cpath d='M384 64.01c0 17.69-14.31 32-32 32h-58.67l-133.3 320H224c17.69 0 32 14.31 32 32s-14.31 32-32 32H32c-17.69 0-32-14.31-32-32s14.31-32 32-32h58.67l133.3-320H160c-17.69 0-32-14.31-32-32s14.31-32 32-32h192c17.7 0 32 14.32 32 32z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .strikethrough:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M332.2 319.9c17.22 12.17 22.33 26.51 18.61 48.21-3.031 17.59-10.88 29.34-24.72 36.99-35.44 19.75-108.5 11.96-186-19.68-16.34-6.686-35.03 1.156-41.72 17.53s1.188 35.05 17.53 41.71c31.75 12.93 95.69 35.37 157.6 35.37 29.62 0 58.81-5.156 83.72-18.96 30.81-17.09 50.44-45.46 56.72-82.11 3.998-23.27 2.168-42.58-3.488-59.05H332.2zm155.8-80-176.5-.03c-15.85-5.614-31.83-10.34-46.7-14.62-85.47-24.62-110.9-39.05-103.7-81.33 2.5-14.53 10.16-25.96 22.72-34.03 20.47-13.15 64.06-23.84 155.4.343 17.09 4.53 34.59-5.654 39.13-22.74 4.531-17.09-5.656-34.59-22.75-39.12-91.31-24.18-160.7-21.62-206.3 7.654C121.8 73.72 103.6 101.1 98.09 133.1c-8.83 51.4 9.81 84.2 39.11 106.8H24c-13.25 0-24 10.75-24 23.1 0 13.25 10.75 23.1 24 23.1h464c13.25 0 24-10.75 24-23.1 0-12.3-10.7-23.1-24-23.1z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M332.2 319.9c17.22 12.17 22.33 26.51 18.61 48.21-3.031 17.59-10.88 29.34-24.72 36.99-35.44 19.75-108.5 11.96-186-19.68-16.34-6.686-35.03 1.156-41.72 17.53s1.188 35.05 17.53 41.71c31.75 12.93 95.69 35.37 157.6 35.37 29.62 0 58.81-5.156 83.72-18.96 30.81-17.09 50.44-45.46 56.72-82.11 3.998-23.27 2.168-42.58-3.488-59.05H332.2zm155.8-80-176.5-.03c-15.85-5.614-31.83-10.34-46.7-14.62-85.47-24.62-110.9-39.05-103.7-81.33 2.5-14.53 10.16-25.96 22.72-34.03 20.47-13.15 64.06-23.84 155.4.343 17.09 4.53 34.59-5.654 39.13-22.74 4.531-17.09-5.656-34.59-22.75-39.12-91.31-24.18-160.7-21.62-206.3 7.654C121.8 73.72 103.6 101.1 98.09 133.1c-8.83 51.4 9.81 84.2 39.11 106.8H24c-13.25 0-24 10.75-24 23.1 0 13.25 10.75 23.1 24 23.1h464c13.25 0 24-10.75 24-23.1 0-12.3-10.7-23.1-24-23.1z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .link:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath d='M598.6 41.41C570.1 13.8 534.8 0 498.6 0s-72.36 13.8-99.96 41.41l-43.36 43.36c15.11 8.012 29.47 17.58 41.91 30.02 3.146 3.146 5.898 6.518 8.742 9.838l37.96-37.96C458.5 72.05 477.1 64 498.6 64c20.67 0 40.1 8.047 54.71 22.66 14.61 14.61 22.66 34.04 22.66 54.71s-8.049 40.1-22.66 54.71l-133.3 133.3C405.5 343.1 386 352 365.4 352s-40.1-8.048-54.71-22.66C296 314.7 287.1 295.3 287.1 274.6s8.047-40.1 22.66-54.71l4.44-3.49c-2.1-3.9-4.3-7.9-7.5-11.1-8.6-8.6-19.9-13.3-32.1-13.3-11.93 0-23.1 4.664-31.61 12.97-30.71 53.96-23.63 123.6 22.39 169.6C293 402.2 329.2 416 365.4 416c36.18 0 72.36-13.8 99.96-41.41L598.6 241.3c28.45-28.45 42.24-66.01 41.37-103.3-.87-35.9-14.57-69.84-41.37-96.59zM234 387.4l-37.9 37.9C181.5 439.1 162 448 141.4 448c-20.67 0-40.1-8.047-54.71-22.66-14.61-14.61-22.66-34.04-22.66-54.71s8.049-40.1 22.66-54.71l133.3-133.3C234.5 168 253.1 160 274.6 160s40.1 8.048 54.71 22.66c14.62 14.61 22.66 34.04 22.66 54.71s-8.047 40.1-22.66 54.71l-3.51 3.52c2.094 3.939 4.219 7.895 7.465 11.15C341.9 315.3 353.3 320 365.4 320c11.93 0 23.1-4.664 31.61-12.97 30.71-53.96 23.63-123.6-22.39-169.6C346.1 109.8 310.8 96 274.6 96c-36.2 0-72.3 13.8-99.9 41.4L41.41 270.7C13.81 298.3 0 334.48 0 370.66c0 36.18 13.8 72.36 41.41 99.97C69.01 498.2 105.2 512 141.4 512c36.18 0 72.36-13.8 99.96-41.41l43.36-43.36c-15.11-8.012-29.47-17.58-41.91-30.02-3.21-3.11-5.91-6.51-8.81-9.81z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath d='M598.6 41.41C570.1 13.8 534.8 0 498.6 0s-72.36 13.8-99.96 41.41l-43.36 43.36c15.11 8.012 29.47 17.58 41.91 30.02 3.146 3.146 5.898 6.518 8.742 9.838l37.96-37.96C458.5 72.05 477.1 64 498.6 64c20.67 0 40.1 8.047 54.71 22.66 14.61 14.61 22.66 34.04 22.66 54.71s-8.049 40.1-22.66 54.71l-133.3 133.3C405.5 343.1 386 352 365.4 352s-40.1-8.048-54.71-22.66C296 314.7 287.1 295.3 287.1 274.6s8.047-40.1 22.66-54.71l4.44-3.49c-2.1-3.9-4.3-7.9-7.5-11.1-8.6-8.6-19.9-13.3-32.1-13.3-11.93 0-23.1 4.664-31.61 12.97-30.71 53.96-23.63 123.6 22.39 169.6C293 402.2 329.2 416 365.4 416c36.18 0 72.36-13.8 99.96-41.41L598.6 241.3c28.45-28.45 42.24-66.01 41.37-103.3-.87-35.9-14.57-69.84-41.37-96.59zM234 387.4l-37.9 37.9C181.5 439.1 162 448 141.4 448c-20.67 0-40.1-8.047-54.71-22.66-14.61-14.61-22.66-34.04-22.66-54.71s8.049-40.1 22.66-54.71l133.3-133.3C234.5 168 253.1 160 274.6 160s40.1 8.048 54.71 22.66c14.62 14.61 22.66 34.04 22.66 54.71s-8.047 40.1-22.66 54.71l-3.51 3.52c2.094 3.939 4.219 7.895 7.465 11.15C341.9 315.3 353.3 320 365.4 320c11.93 0 23.1-4.664 31.61-12.97 30.71-53.96 23.63-123.6-22.39-169.6C346.1 109.8 310.8 96 274.6 96c-36.2 0-72.3 13.8-99.9 41.4L41.41 270.7C13.81 298.3 0 334.48 0 370.66c0 36.18 13.8 72.36 41.41 99.97C69.01 498.2 105.2 512 141.4 512c36.18 0 72.36-13.8 99.96-41.41l43.36-43.36c-15.11-8.012-29.47-17.58-41.91-30.02-3.21-3.11-5.91-6.51-8.81-9.81z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .heading:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M0 64c0-17.7 14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16v112h224V96h-16c-17.7 0-32-14.3-32-32s14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16v320h16c17.7 0 32 14.3 32 32s-14.3 32-32 32h-96c-17.7 0-32-14.3-32-32s14.3-32 32-32h16V272H112v144h16c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h16V96H32C14.3 96 0 81.7 0 64z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M0 64c0-17.7 14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16v112h224V96h-16c-17.7 0-32-14.3-32-32s14.3-32 32-32h96c17.7 0 32 14.3 32 32s-14.3 32-32 32h-16v320h16c17.7 0 32 14.3 32 32s-14.3 32-32 32h-96c-17.7 0-32-14.3-32-32s14.3-32 32-32h16V272H112v144h16c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h16V96H32C14.3 96 0 81.7 0 64z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .quote:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M96 224c-11.28 0-21.95 2.3-32 5.9V224c0-35.3 28.7-64 64-64 17.67 0 32-14.33 32-32s-14.3-32-32-32C57.42 96 0 153.4 0 224v96c0 53.02 42.98 96 96 96s96-42.98 96-96-43-96-96-96zm256 0c-11.28 0-21.95 2.305-32 5.879V224c0-35.3 28.7-64 64-64 17.67 0 32-14.33 32-32s-14.33-32-32-32c-70.58 0-128 57.42-128 128v96c0 53.02 42.98 96 96 96s96-42.98 96-96-43-96-96-96z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M96 224c-11.28 0-21.95 2.3-32 5.9V224c0-35.3 28.7-64 64-64 17.67 0 32-14.33 32-32s-14.3-32-32-32C57.42 96 0 153.4 0 224v96c0 53.02 42.98 96 96 96s96-42.98 96-96-43-96-96-96zm256 0c-11.28 0-21.95 2.305-32 5.879V224c0-35.3 28.7-64 64-64 17.67 0 32-14.33 32-32s-14.33-32-32-32c-70.58 0-128 57.42-128 128v96c0 53.02 42.98 96 96 96s96-42.98 96-96-43-96-96-96z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .code:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath d='M416 31.94C416 21.75 408.1 0 384.1 0c-13.98 0-26.87 9.072-30.89 23.18l-128 448a31.933 31.933 0 0 0-1.241 8.801C223.1 490.3 232 512 256 512c13.92 0 26.73-9.157 30.75-23.22l128-448c.85-2.97 1.25-5.93 1.25-8.84zM176 143.1c0-18.28-14.95-32-32-32-8.188 0-16.38 3.125-22.62 9.376l-112 112C3.125 239.6 0 247.8 0 255.1s3.125 17.3 9.375 23.5l112 112c6.225 6.3 14.425 8.5 22.625 8.5 17.05 0 32-13.73 32-32 0-8.188-3.125-16.38-9.375-22.63L77.25 255.1l89.38-89.38c6.27-5.42 9.37-13.52 9.37-22.62zm464 112c0-8.188-3.125-16.38-9.375-22.63l-112-112C512.4 115.1 504.2 111.1 496 111.1c-17.05 0-32 13.73-32 32 0 8.188 3.125 16.38 9.375 22.63l89.38 89.38-89.38 89.38C467.1 351.6 464 359.8 464 367.1c0 18.28 14.95 32 32 32 8.188 0 16.38-3.125 22.62-9.376l112-112C636.9 272.4 640 264.2 640 255.1z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'%3E%3Cpath d='M416 31.94C416 21.75 408.1 0 384.1 0c-13.98 0-26.87 9.072-30.89 23.18l-128 448a31.933 31.933 0 0 0-1.241 8.801C223.1 490.3 232 512 256 512c13.92 0 26.73-9.157 30.75-23.22l128-448c.85-2.97 1.25-5.93 1.25-8.84zM176 143.1c0-18.28-14.95-32-32-32-8.188 0-16.38 3.125-22.62 9.376l-112 112C3.125 239.6 0 247.8 0 255.1s3.125 17.3 9.375 23.5l112 112c6.225 6.3 14.425 8.5 22.625 8.5 17.05 0 32-13.73 32-32 0-8.188-3.125-16.38-9.375-22.63L77.25 255.1l89.38-89.38c6.27-5.42 9.37-13.52 9.37-22.62zm464 112c0-8.188-3.125-16.38-9.375-22.63l-112-112C512.4 115.1 504.2 111.1 496 111.1c-17.05 0-32 13.73-32 32 0 8.188 3.125 16.38 9.375 22.63l89.38 89.38-89.38 89.38C467.1 351.6 464 359.8 464 367.1c0 18.28 14.95 32 32 32 8.188 0 16.38-3.125 22.62-9.376l112-112C636.9 272.4 640 264.2 640 255.1z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .unordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M16 96c0-26.51 21.49-48 48-48s48 21.49 48 48c0 26.5-21.49 48-48 48s-48-21.5-48-48zm464-32c17.7 0 32 14.33 32 32 0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32 0-17.67 14.3-32 32-32h288zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H192c-17.7 0-32-14.3-32-32s14.3-32 32-32h288zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H192c-17.7 0-32-14.3-32-32s14.3-32 32-32h288zM16 416c0-26.5 21.49-48 48-48s48 21.5 48 48-21.49 48-48 48-48-21.5-48-48zm96-160c0 26.5-21.49 48-48 48s-48-21.5-48-48 21.49-48 48-48 48 21.5 48 48z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M16 96c0-26.51 21.49-48 48-48s48 21.49 48 48c0 26.5-21.49 48-48 48s-48-21.5-48-48zm464-32c17.7 0 32 14.33 32 32 0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32 0-17.67 14.3-32 32-32h288zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H192c-17.7 0-32-14.3-32-32s14.3-32 32-32h288zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H192c-17.7 0-32-14.3-32-32s14.3-32 32-32h288zM16 416c0-26.5 21.49-48 48-48s48 21.5 48 48-21.49 48-48 48-48-21.5-48-48zm96-160c0 26.5-21.49 48-48 48s-48-21.5-48-48 21.49-48 48-48 48 21.5 48 48z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .ordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M55.1 56.04c0-13.26 11.64-24 24-24h32c14.2 0 24 10.74 24 24V176h16c14.2 0 24 10.8 24 24 0 13.3-9.8 24-24 24h-80c-12.36 0-24-10.7-24-24 0-13.2 11.64-24 24-24h16V80.04h-8c-12.36 0-24-10.75-24-24zm63.6 285.16c-6.6-7.4-18.3-6.9-24.05 1.2l-11.12 15.5c-7.7 10.8-22.69 13.3-33.48 5.6-10.79-7.7-13.28-22.7-5.58-33.4l11.12-15.6c23.74-33.3 72.31-35.7 99.21-4.9 21.3 23.5 20.8 60.9-1.1 84.7L118.8 432H152c13.3 0 24 10.7 24 24s-10.7 24-24 24H64c-9.53 0-18.16-5.6-21.98-14.4-3.83-8.7-2.12-18.9 4.34-25.9l72.04-78c5.3-5.8 5.4-14.6.3-20.5zM512 64c17.7 0 32 14.33 32 32 0 17.7-14.3 32-32 32H256c-17.7 0-32-14.3-32-32 0-17.67 14.3-32 32-32h256zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h256zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h256z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M55.1 56.04c0-13.26 11.64-24 24-24h32c14.2 0 24 10.74 24 24V176h16c14.2 0 24 10.8 24 24 0 13.3-9.8 24-24 24h-80c-12.36 0-24-10.7-24-24 0-13.2 11.64-24 24-24h16V80.04h-8c-12.36 0-24-10.75-24-24zm63.6 285.16c-6.6-7.4-18.3-6.9-24.05 1.2l-11.12 15.5c-7.7 10.8-22.69 13.3-33.48 5.6-10.79-7.7-13.28-22.7-5.58-33.4l11.12-15.6c23.74-33.3 72.31-35.7 99.21-4.9 21.3 23.5 20.8 60.9-1.1 84.7L118.8 432H152c13.3 0 24 10.7 24 24s-10.7 24-24 24H64c-9.53 0-18.16-5.6-21.98-14.4-3.83-8.7-2.12-18.9 4.34-25.9l72.04-78c5.3-5.8 5.4-14.6.3-20.5zM512 64c17.7 0 32 14.33 32 32 0 17.7-14.3 32-32 32H256c-17.7 0-32-14.3-32-32 0-17.67 14.3-32 32-32h256zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h256zm0 160c17.7 0 32 14.3 32 32s-14.3 32-32 32H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h256z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .table:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1792 1792'%3E%3Cpath d='M576 1376v-192q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V800q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zM576 608V416q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm-512-768V416q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V416q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm128-320v1088q0 66-47 113t-113 47H224q-66 0-113-47t-47-113V288q0-66 47-113t113-47h1344q66 0 113 47t47 113z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1792 1792'%3E%3Cpath d='M576 1376v-192q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V800q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zM576 608V416q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm-512-768V416q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V416q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm128-320v1088q0 66-47 113t-113 47H224q-66 0-113-47t-47-113V288q0-66 47-113t113-47h1344q66 0 113 47t47 113z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .upload-image:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M447.1 32h-484C28.64 32-.01 60.65-.01 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96c.01-35.35-27.79-64-63.99-64zm-336 64c26.51 0 48 21.49 48 48s-20.6 48-48 48-48-21.49-48-48 22.38-48 48-48zm335 311.6c-2.8 5.2-8.2 8.4-14.1 8.4H82.01a15.993 15.993 0 0 1-14.26-8.75 16 16 0 0 1 1.334-16.68l70-96C142.1 290.4 146.9 288 152 288s9.916 2.441 12.93 6.574l32.46 44.51 93.3-139.1C293.7 194.7 298.7 192 304 192s10.35 2.672 13.31 7.125l128 192c3.29 4.875 3.59 11.175.79 16.475z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M447.1 32h-484C28.64 32-.01 60.65-.01 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96c.01-35.35-27.79-64-63.99-64zm-336 64c26.51 0 48 21.49 48 48s-20.6 48-48 48-48-21.49-48-48 22.38-48 48-48zm335 311.6c-2.8 5.2-8.2 8.4-14.1 8.4H82.01a15.993 15.993 0 0 1-14.26-8.75 16 16 0 0 1 1.334-16.68l70-96C142.1 290.4 146.9 288 152 288s9.916 2.441 12.93 6.574l32.46 44.51 93.3-139.1C293.7 194.7 298.7 192 304 192s10.35 2.672 13.31 7.125l128 192c3.29 4.875 3.59 11.175.79 16.475z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .undo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M480 256c0 123.4-100.5 223.9-223.9 223.9-48.84 0-95.17-15.58-134.2-44.86-14.12-10.59-16.97-30.66-6.375-44.81 10.59-14.12 30.62-16.94 44.81-6.375 27.84 20.91 61 31.94 95.88 31.94C344.3 415.8 416 344.1 416 256S344.31 96.2 256.2 96.2c-37.46 0-73.09 13.49-101.3 36.64l45.12 45.14c17.01 17.02 4.955 46.1-19.1 46.1H35.17C24.58 224.1 16 215.5 16 204.9V59.04C16 35 45.07 22.96 62.07 39.97l47.6 47.63C149.9 52.71 201.5 32.11 256.1 32.11 379.5 32.11 480 132.6 480 256z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M480 256c0 123.4-100.5 223.9-223.9 223.9-48.84 0-95.17-15.58-134.2-44.86-14.12-10.59-16.97-30.66-6.375-44.81 10.59-14.12 30.62-16.94 44.81-6.375 27.84 20.91 61 31.94 95.88 31.94C344.3 415.8 416 344.1 416 256S344.31 96.2 256.2 96.2c-37.46 0-73.09 13.49-101.3 36.64l45.12 45.14c17.01 17.02 4.955 46.1-19.1 46.1H35.17C24.58 224.1 16 215.5 16 204.9V59.04C16 35 45.07 22.96 62.07 39.97l47.6 47.63C149.9 52.71 201.5 32.11 256.1 32.11 379.5 32.11 480 132.6 480 256z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .redo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M468.9 32.11c13.87 0 27.18 10.77 27.18 27.04v145.9c0 10.59-8.584 19.17-19.17 19.17h-145.7c-16.28 0-27.06-13.32-27.06-27.2 0-6.634 2.461-13.4 7.96-18.9l45.12-45.14c-28.22-23.14-63.85-36.64-101.3-36.64-88.09 0-159.8 71.69-159.8 159.8S167.8 415.9 255.9 415.9c73.14 0 89.44-38.31 115.1-38.31 18.48 0 31.97 15.04 31.97 31.96 0 35.04-81.59 70.41-147 70.41-123.4 0-223.9-100.5-223.9-223.9S132.6 32.44 256 32.44c54.6 0 106.2 20.39 146.4 55.26L450 40.07c5.5-5.5 12.3-7.96 18.9-7.96z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M468.9 32.11c13.87 0 27.18 10.77 27.18 27.04v145.9c0 10.59-8.584 19.17-19.17 19.17h-145.7c-16.28 0-27.06-13.32-27.06-27.2 0-6.634 2.461-13.4 7.96-18.9l45.12-45.14c-28.22-23.14-63.85-36.64-101.3-36.64-88.09 0-159.8 71.69-159.8 159.8S167.8 415.9 255.9 415.9c73.14 0 89.44-38.31 115.1-38.31 18.48 0 31.97 15.04 31.97 31.96 0 35.04-81.59 70.41-147 70.41-123.4 0-223.9-100.5-223.9-223.9S132.6 32.44 256 32.44c54.6 0 106.2 20.39 146.4 55.26L450 40.07c5.5-5.5 12.3-7.96 18.9-7.96z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-statusbar{display:none}.fi-fo-rich-editor trix-toolbar .trix-dialogs{position:relative}.fi-fo-rich-editor trix-toolbar .trix-dialog{--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgba(var(--gray-50),var(--tw-bg-opacity));border-radius:.5rem;bottom:auto;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);left:0;padding:.5rem;position:absolute;right:0;top:1rem}.fi-fo-rich-editor trix-toolbar .trix-dialog:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields{display:flex;flex-direction:column;gap:.5rem;width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group{display:flex;gap:.5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-style:none;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--gray-950),var(--tw-text-opacity));display:block;font-size:.875rem;line-height:1.25rem;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:.75rem;padding-top:.375rem;padding-inline-start:.75rem;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:hsla(0,0%,100%,.2);background-color:rgba(var(--gray-700),var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}@media (min-width:640px){.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{font-size:.875rem;line-height:1.5rem}}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button{--tw-bg-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-200),var(--tw-ring-opacity));background-color:rgba(var(--gray-50),var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.75rem;line-height:1rem;padding:.125rem .5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button:is(.dark *){--tw-bg-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-600),var(--tw-ring-opacity));background-color:rgba(var(--gray-700),var(--tw-bg-opacity))}.fi-fo-rich-editor trix-editor:empty:before{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fi-fo-rich-editor trix-editor:empty:is(.dark *):before{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fi-fo-rich-editor trix-editor:empty:before{content:attr(placeholder)}.fi-fo-rich-editor trix-editor.prose :where(ol):not(:where([class~=not-prose] *)),.fi-fo-rich-editor trix-editor.prose :where(ul):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:1.625em!important}.fi-fo-rich-editor trix-editor.prose :where(ul>li):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:.375em!important}select:not(.choices){background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E")}[dir=rtl] select{background-position:left .5rem center!important}.choices{outline:2px solid transparent;outline-offset:2px;position:relative}.choices [hidden]{display:none!important}.choices[data-type*=select-one] .has-no-choices{display:none}.choices[data-type*=select-one] .choices__input{display:block;margin:0;width:100%}.choices__inner{background-repeat:no-repeat;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:2rem;padding-top:.375rem;padding-inline-start:.75rem}@media (min-width:640px){.choices__inner{font-size:.875rem;line-height:1.5rem}}.choices__inner{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-size:1.5em 1.5em}.choices.is-disabled .choices__inner{cursor:default}[dir=rtl] .choices__inner{background-position:left .5rem center}.choices__list--single{display:inline-block}.choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-950),var(--tw-text-opacity))}.choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.choices.is-disabled .choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices.is-disabled .choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__list--multiple{display:flex;flex-wrap:wrap;gap:.375rem}.choices__list--multiple:not(:empty){margin-bottom:.25rem;margin-left:-.25rem;margin-right:-.25rem;padding-bottom:.125rem;padding-top:.125rem}.choices__list--multiple .choices__item{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-color:rgba(var(--primary-600),0.1);align-items:center;background-color:rgba(var(--primary-50),var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--primary-600),var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;gap:.25rem;line-height:1rem;padding:.25rem .5rem;word-break:break-all}.choices__list--multiple .choices__item:is(.dark *){--tw-text-opacity:1;--tw-ring-color:rgba(var(--primary-400),0.3);background-color:rgba(var(--primary-400),.1);color:rgba(var(--primary-400),var(--tw-text-opacity))}.choices__list--dropdown,.choices__list[aria-expanded]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--gray-950),0.05);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:none;font-size:.875rem;line-height:1.25rem;margin-top:.5rem;overflow:hidden;overflow-wrap:break-word;position:absolute;top:100%;width:100%;will-change:visibility;z-index:10}.choices__list--dropdown:is(.dark *),.choices__list[aria-expanded]:is(.dark *){--tw-bg-opacity:1;--tw-ring-color:hsla(0,0%,100%,.1);background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.is-active.choices__list--dropdown,.is-active.choices__list[aria-expanded]{display:block;padding:.25rem}.choices__list--dropdown .choices__list,.choices__list[aria-expanded] .choices__list{max-height:15rem;overflow:auto;will-change:scroll-position}.choices__item--choice{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity));padding:.5rem;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.choices__item--choice:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__item--choice.choices__item--selectable{--tw-text-opacity:1;border-radius:.375rem;color:rgba(var(--gray-950),var(--tw-text-opacity))}.choices__item--choice.choices__item--selectable:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.choices__list--dropdown .choices__item--selectable.is-highlighted,.choices__list[aria-expanded] .choices__item--selectable.is-highlighted{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.choices__list--dropdown .choices__item--selectable.is-highlighted:is(.dark *),.choices__list[aria-expanded] .choices__item--selectable.is-highlighted:is(.dark *){background-color:hsla(0,0%,100%,.05)}.choices__item{cursor:default}.choices__item--disabled{pointer-events:none}.choices__item--disabled:disabled{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__item--disabled:disabled:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices.is-disabled .choices__placeholder.choices__item,.choices__placeholder.choices__item{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity));cursor:default}.choices.is-disabled .choices__placeholder.choices__item:is(.dark *),.choices__placeholder.choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__button{background-color:transparent;background-position:50%;background-repeat:no-repeat;border-width:0;outline:2px solid transparent;outline-offset:2px;text-indent:-9999px}.choices[data-type*=select-one] .choices__button{height:1rem;inset-inline-end:0;margin-inline-end:2.25rem;opacity:.5;padding:0;position:absolute;transition-duration:75ms;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.choices[data-type*=select-one] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em;top:calc(50% - .5714em)}.dark .choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button{height:1rem;opacity:.5;width:1rem}.choices[data-type*=select-multiple] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em}.dark .choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button:focus-visible,.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=select-one] .choices__button:focus-visible,.choices[data-type*=select-one] .choices__button:hover{opacity:.7}.choices[data-type*=select-multiple] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-multiple] .choices__button:hover:is(.dark *),.choices[data-type*=select-one] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-one] .choices__button:hover:is(.dark *){opacity:.6}.choices.is-disabled .choices__button,.choices[data-type*=select-one] .choices__item[data-value=""] .choices__button{display:none}.choices__input{--tw-text-opacity:1;background-color:transparent!important;border-style:none;color:rgba(var(--gray-950),var(--tw-text-opacity));font-size:1rem!important;line-height:1.5rem!important;padding:0!important;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.choices__input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__input:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.choices__input:disabled{--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-500),1);color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__input:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.choices__input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__input:disabled:is(.dark *){--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-400),1);color:rgba(var(--gray-400),var(--tw-text-opacity))}@media (min-width:640px){.choices__input{font-size:.875rem!important;line-height:1.5rem}}.choices__list--dropdown .choices__input{padding:.5rem!important}.choices__input::-webkit-search-cancel-button,.choices__input::-webkit-search-decoration,.choices__input::-webkit-search-results-button,.choices__input::-webkit-search-results-decoration{display:none}.choices__input::-ms-clear,.choices__input::-ms-reveal{display:none;height:0;width:0}.choices__group{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity));padding:1rem .5rem .5rem}.choices__group:first-child{padding-top:.5rem}.choices__group:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.webkit-calendar-picker-indicator\:opacity-0::-webkit-calendar-picker-indicator{opacity:0}/*! Bundled license information: +input::-webkit-datetime-edit{display:block;padding:0}.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{inset:0;position:absolute}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.filepond--assistant{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--browser.filepond--browser{font-size:0;left:1em;margin:0;opacity:0;padding:0;position:absolute;top:1.75em;width:calc(100% - 2em)}.filepond--data{border:none;contain:strict;height:0;margin:0;padding:0;visibility:hidden;width:0}.filepond--data,.filepond--drip{pointer-events:none;position:absolute}.filepond--drip{background:rgba(0,0,0,.01);border-radius:.5em;inset:0;opacity:.1;overflow:hidden}.filepond--drip-blob{background:#292625;border-radius:50%;height:8em;margin-left:-4em;margin-top:-4em;transform-origin:center center;width:8em}.filepond--drip-blob,.filepond--drop-label{left:0;position:absolute;top:0;will-change:transform,opacity}.filepond--drop-label{align-items:center;color:#4f4f4f;display:flex;height:0;justify-content:center;margin:0;right:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--drop-label.filepond--drop-label label{display:block;margin:0;padding:.5em}.filepond--drop-label label{cursor:default;font-size:.875em;font-weight:400;line-height:1.5;text-align:center}.filepond--label-action{-webkit-text-decoration-skip:ink;cursor:pointer;text-decoration:underline;text-decoration-color:#a7a4a4;text-decoration-skip-ink:auto}.filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.filepond--file-action-button.filepond--file-action-button{border:none;font-family:inherit;font-size:1em;height:1.625em;line-height:inherit;margin:0;outline:none;padding:0;width:1.625em;will-change:transform,opacity}.filepond--file-action-button.filepond--file-action-button span{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file-action-button.filepond--file-action-button svg{height:100%;width:100%}.filepond--file-action-button.filepond--file-action-button:after{content:"";inset:-.75em;position:absolute}.filepond--file-action-button{background-color:#00000080;background-image:none;border-radius:50%;box-shadow:0 0 #fff0;color:#fff;cursor:auto;transition:box-shadow .25s ease-in}.filepond--file-action-button:focus,.filepond--file-action-button:hover{box-shadow:0 0 0 .125em #ffffffe6}.filepond--file-action-button[disabled]{background-color:#00000040;color:#ffffff80}.filepond--file-action-button[hidden]{display:none}.filepond--file-info{align-items:flex-start;display:flex;flex:1;flex-direction:column;margin:0 .5em 0 0;min-width:0;pointer-events:none;position:static;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-info *{margin:0}.filepond--file-info .filepond--file-info-main{font-size:.75em;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.filepond--file-info .filepond--file-info-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out;white-space:nowrap}.filepond--file-info .filepond--file-info-sub:empty{display:none}.filepond--file-status{align-items:flex-end;display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;margin:0;min-width:2.25em;pointer-events:none;position:static;text-align:right;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-status *{margin:0;white-space:nowrap}.filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.filepond--file-status .filepond--file-status-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out}.filepond--file-wrapper.filepond--file-wrapper{border:none;height:100%;margin:0;min-width:0;padding:0}.filepond--file-wrapper.filepond--file-wrapper>legend{clip:rect(1px,1px,1px,1px);border:0;clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file{align-items:flex-start;border-radius:.5em;color:#fff;display:flex;height:100%;padding:.5625em;position:static}.filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.filepond--file .filepond--file-action-button,.filepond--file .filepond--processing-complete-indicator,.filepond--file .filepond--progress-indicator{position:absolute}.filepond--file [data-align*=left]{left:.5625em}.filepond--file [data-align*=right]{right:.5625em}.filepond--file [data-align*=center]{left:calc(50% - .8125em)}.filepond--file [data-align*=bottom]{bottom:1.125em}.filepond--file [data-align=center]{top:calc(50% - .8125em)}.filepond--file .filepond--progress-indicator{margin-top:.1875em}.filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}[data-filepond-item-state*=error] .filepond--file-info,[data-filepond-item-state*=invalid] .filepond--file-info,[data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}[data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}[data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{animation:fall .5s linear .125s both}[data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--file-info-sub,[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}[data-filepond-item-state*=error] .filepond--file-wrapper,[data-filepond-item-state*=error] .filepond--panel,[data-filepond-item-state*=invalid] .filepond--file-wrapper,[data-filepond-item-state*=invalid] .filepond--panel{animation:shake .65s linear both}[data-filepond-item-state*=busy] .filepond--progress-indicator svg{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes shake{10%,90%{transform:translate(-.0625em)}20%,80%{transform:translate(.125em)}30%,50%,70%{transform:translate(-.25em)}40%,60%{transform:translate(.25em)}}@keyframes fall{0%{animation-timing-function:ease-out;opacity:0;transform:scale(.5)}70%{animation-timing-function:ease-in-out;opacity:1;transform:scale(1.1)}to{animation-timing-function:ease-out;transform:scale(1)}}.filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.filepond--hopper[data-hopper-state=drag-over]:after{content:"";inset:0;position:absolute;z-index:100}.filepond--progress-indicator{z-index:103}.filepond--file-action-button{z-index:102}.filepond--file-status{z-index:101}.filepond--file-info{z-index:100}.filepond--item{left:0;margin:.25em;padding:0;position:absolute;right:0;top:0;touch-action:none;will-change:transform,opacity;z-index:1}.filepond--item>.filepond--panel{z-index:-1}.filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em #00000040}.filepond--item>.filepond--file-wrapper,.filepond--item>.filepond--panel{transition:opacity .15s ease-out}.filepond--item[data-drag-state]{cursor:grab}.filepond--item[data-drag-state]>.filepond--panel{box-shadow:0 0 0 transparent;transition:box-shadow .125s ease-in-out}.filepond--item[data-drag-state=drag]{cursor:grabbing}.filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em #00000053}.filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.filepond--item-panel{background-color:#64605e}[data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}[data-filepond-item-state*=error] .filepond--item-panel,[data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.filepond--item-panel{border-radius:.5em;transition:background-color .25s}.filepond--list-scroller{left:0;margin:0;position:absolute;right:0;top:0;will-change:transform}.filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.filepond--list-scroller[data-state=overflow]{-webkit-overflow-scrolling:touch;-webkit-mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);overflow-x:hidden;overflow-y:scroll}.filepond--list-scroller::-webkit-scrollbar{background:transparent}.filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.filepond--list-scroller::-webkit-scrollbar-thumb{background-clip:content-box;background-color:#0000004d;border:.3125em solid transparent;border-radius:99999px}.filepond--list.filepond--list{list-style-type:none;margin:0;padding:0;position:absolute;top:0;will-change:transform}.filepond--list{left:.75em;right:.75em}.filepond--root[data-style-panel-layout~=integrated]{height:100%;margin:0;max-width:none;width:100%}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{align-items:center;bottom:0;display:flex;height:auto;justify-content:center;z-index:7}.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{height:100%;margin-bottom:0;margin-top:0;overflow:hidden}.filepond--root[data-style-panel-layout~=compact] .filepond--list,.filepond--root[data-style-panel-layout~=integrated] .filepond--list{height:100%;left:0;right:0}.filepond--root[data-style-panel-layout~=compact] .filepond--item,.filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.filepond--root[data-style-panel-layout~=circle] .filepond--file-status,.filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*{display:none}@media not all and (-webkit-min-device-pixel-ratio:0),not all and (min-resolution:.001dpcm){@supports (-webkit-appearance:none) and (stroke-color:transparent){.filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.filepond--panel-root{background-color:#f1f0ef;border-radius:.5em}.filepond--panel{height:100%!important;left:0;margin:0;pointer-events:none;position:absolute;right:0;top:0}.filepond-panel:not([data-scalable=false]){height:auto!important}.filepond--panel[data-scalable=false]>div{display:none}.filepond--panel[data-scalable=true]{background-color:transparent!important;border:none!important;transform-style:preserve-3d}.filepond--panel-bottom,.filepond--panel-center,.filepond--panel-top{left:0;margin:0;padding:0;position:absolute;right:0;top:0}.filepond--panel-bottom,.filepond--panel-top{height:.5em}.filepond--panel-top{border-bottom:none!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.filepond--panel-top:after{background-color:inherit;bottom:-1px;content:"";height:2px;left:0;position:absolute;right:0}.filepond--panel-bottom,.filepond--panel-center{backface-visibility:hidden;transform:translate3d(0,.5em,0);transform-origin:left top;will-change:transform}.filepond--panel-bottom{border-top:none!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.filepond--panel-bottom:before{background-color:inherit;content:"";height:2px;left:0;position:absolute;right:0;top:-1px}.filepond--panel-center{border-bottom:none!important;border-radius:0!important;border-top:none!important;height:100px!important}.filepond--panel-center:not([style]){visibility:hidden}.filepond--progress-indicator{color:#fff;height:1.25em;margin:0;pointer-events:none;position:static;width:1.25em;will-change:transform,opacity}.filepond--progress-indicator svg{height:100%;transform-box:fill-box;vertical-align:top;width:100%}.filepond--progress-indicator path{fill:none;stroke:currentColor}.filepond--list-scroller{z-index:6}.filepond--drop-label{z-index:5}.filepond--drip{z-index:3}.filepond--root>.filepond--panel{z-index:2}.filepond--browser{z-index:1}.filepond--root{box-sizing:border-box;contain:layout style size;direction:ltr;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:450;line-height:normal;margin-bottom:1em;position:relative;text-align:left;text-rendering:optimizeLegibility}.filepond--root *{box-sizing:inherit;line-height:inherit}.filepond--root :not(text){font-size:inherit}.filepond--root[data-disabled]{pointer-events:none}.filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.filepond--root[data-disabled] .filepond--list{pointer-events:none}.filepond--root .filepond--drop-label{min-height:4.75em}.filepond--root .filepond--list-scroller{margin-bottom:1em;margin-top:1em}.filepond--root .filepond--credits{bottom:-14px;color:inherit;font-size:11px;line-height:.85;opacity:.175;position:absolute;right:0;text-decoration:none;z-index:3}.filepond--root .filepond--credits[style]{bottom:auto;margin-top:14px;top:0}.filepond--action-edit-item.filepond--action-edit-item{height:2em;padding:.1875em;width:2em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.filepond--action-edit-item-alt{background:transparent;border:none;color:inherit;font-family:inherit;line-height:inherit;margin:0 0 0 .25em;outline:none;padding:0;pointer-events:all;position:absolute}.filepond--action-edit-item-alt svg{height:1.3125em;width:1.3125em}.filepond--action-edit-item-alt span{font-size:0;opacity:0}.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}.filepond--image-preview-markup{left:0;position:absolute;top:0}.filepond--image-preview-wrapper{z-index:2}.filepond--image-preview-overlay{display:block;left:0;margin:0;max-height:7rem;min-height:5rem;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.filepond--image-preview-overlay svg{color:inherit;height:auto;max-height:inherit;width:100%}.filepond--image-preview-overlay-idle{color:#282828d9;mix-blend-mode:multiply}.filepond--image-preview-overlay-success{color:#369763;mix-blend-mode:normal}.filepond--image-preview-overlay-failure{color:#c44e47;mix-blend-mode:normal}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.filepond--image-preview-wrapper{background:rgba(0,0,0,.01);border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.filepond--image-preview{align-items:center;background:#222;display:flex;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;will-change:transform,opacity;z-index:1}.filepond--image-clip{margin:0 auto;overflow:hidden;position:relative}.filepond--image-clip[data-transparency-indicator=grid] canvas,.filepond--image-clip[data-transparency-indicator=grid] img{background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0h50v50H0M50 50h50v50H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.filepond--image-bitmap,.filepond--image-vector{left:0;position:absolute;top:0;will-change:transform}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{align-items:center;display:flex;height:100%;justify-content:center}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{bottom:0;top:auto;transform:scaleY(-1)}.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-bottom:.1875em;margin-left:.1875em;margin-top:0}.filepond--media-preview audio{display:none}.filepond--media-preview .audioplayer{margin:2.3em auto auto;width:calc(100% - 1.4em)}.filepond--media-preview .playpausebtn{background-position:50%;background-repeat:no-repeat;border:none;border-radius:25px;cursor:pointer;float:left;height:25px;margin-right:.3em;margin-top:.3em;outline:none;width:25px}.filepond--media-preview .playpausebtn:hover{background-color:#00000080}.filepond--media-preview .play{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyElEQVQ4T9XUsWoCQRRG4XPaFL5SfIy8gKYKBCysrax8Ahs7qzQ2qVIFOwsrsbEWLEK6EBFGBrIQhN2d3dnGgalm+Jh7789Ix8uOPe4YDCH0gZ66atKW0pJDCE/AEngDXtRjCpwCRucbGANzNVTBqWBhfAJDdV+GNgWj8wtM41bPt3AbsDB2f69d/0dzwC0wUDe54A8wAWbqJbfkD+BZPeQO5QsYqYu6LKb0MIb7VT3VYfG8CnwEHtT3FKi4c8e/TZMyk3LYFrwCgMdHFbRDKS8AAAAASUVORK5CYII=)}.filepond--media-preview .pause{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAh0lEQVQ4T+2UsQkCURBE30PLMbAMMResQrAPsQ0TK9AqDKxGZeTLD74aGNwlhzfZssvADDMrPcOe+RggYZIJcG2s2KinMidZAvu6u6uzT8u+JCeZArfmcKUeK+EaONTdQy23bxgJX8aPHvIHsSnVuzTx36rn2pQFsGuqN//ZlK7vbIDvq6vkJ9yteBXzecYbAAAAAElFTkSuQmCC)}.filepond--media-preview .timeline{background:hsla(0,0%,100%,.3);border-radius:15px;float:left;height:3px;margin-top:1em;width:calc(100% - 2.5em)}.filepond--media-preview .playhead{background:#fff;border-radius:50%;height:13px;margin-top:-5px;width:13px}.filepond--media-preview-wrapper{background:rgba(0,0,0,.01);border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;pointer-events:auto;position:absolute;right:0;top:0}.filepond--media-preview-wrapper:before{background:linear-gradient(180deg,#000 0,transparent);content:" ";filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#000000",endColorstr="#00000000",GradientType=0);height:2em;position:absolute;width:100%;z-index:3}.filepond--media-preview{display:block;height:100%;position:relative;transform-origin:center center;width:100%;will-change:transform,opacity;z-index:1}.filepond--media-preview audio,.filepond--media-preview video{width:100%;will-change:transform}.filepond--root{--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);margin-bottom:0}.filepond--root:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.2);background-color:hsla(0,0%,100%,.05)}.filepond--root[data-disabled=disabled]{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.filepond--root[data-disabled=disabled]:is(.dark *){--tw-ring-color:hsla(0,0%,100%,.1);background-color:transparent}.filepond--panel-root{background-color:transparent}.filepond--drop-label label{--tw-text-opacity:1;color:rgba(var(--gray-600),var(--tw-text-opacity));font-size:.875rem;line-height:1.25rem;padding:.75rem!important}.filepond--drop-label label:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.filepond--label-action{--tw-text-opacity:1;color:rgba(var(--primary-600),var(--tw-text-opacity));font-weight:500;text-decoration-line:none;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.filepond--label-action:hover{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.filepond--label-action:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.filepond--label-action:hover:is(.dark *){--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity))}.filepond--drip-blob{--tw-bg-opacity:1;background-color:rgba(var(--gray-400),var(--tw-bg-opacity))}.filepond--drip-blob:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-500),var(--tw-bg-opacity))}.filepond--root[data-style-panel-layout=grid] .filepond--item{display:inline;width:calc(50% - .5rem)}@media (min-width:1024px){.filepond--root[data-style-panel-layout=grid] .filepond--item{width:calc(33.33% - .5rem)}}.filepond--download-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--download-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--download-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLWRvd25sb2FkIj48cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNE03IDEwbDUgNSA1LTVNMTIgMTVWMyIvPjwvc3ZnPg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--open-icon{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));display:inline-block;height:1rem;margin-inline-end:.25rem;pointer-events:auto;vertical-align:bottom;width:1rem}.filepond--open-icon:hover{background-color:hsla(0,0%,100%,.7)}.filepond--open-icon{-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJoLTYgdy02IiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDZINmEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTBhMiAyIDAgMCAwIDItMnYtNE0xNCA0aDZtMCAwdjZtMC02TDEwIDE0Ii8+PC9zdmc+);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%}.filepond--file-action-button.filepond--action-edit-item{background-color:rgba(0,0,0,.5)}.cropper-drag-box.cropper-crop.cropper-modal{background-color:rgba(var(--gray-100),.5);opacity:1}.cropper-drag-box.cropper-crop.cropper-modal:is(.dark *){background-color:rgba(var(--gray-900),.8)}.fi-fo-file-upload-circle-cropper .cropper-face,.fi-fo-file-upload-circle-cropper .cropper-view-box{border-radius:50%}.CodeMirror{color:#000;direction:ltr;font-family:monospace;height:300px}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{background-color:#f7f7f7;border-right:1px solid #ddd;white-space:nowrap}.CodeMirror-linenumber{color:#999;min-width:20px;padding:0 3px 0 5px;text-align:right;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{background:#7e7;border:0!important;width:auto}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.cm-fat-cursor{caret-color:transparent}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{inset:-50px 0 0;overflow:hidden;position:absolute}.CodeMirror-ruler{border-left:1px solid #ccc;bottom:0;position:absolute;top:0}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{background:#fff;overflow:hidden;position:relative}.CodeMirror-scroll{height:100%;margin-bottom:-50px;margin-right:-50px;outline:0;overflow:scroll!important;padding-bottom:50px;position:relative;z-index:0}.CodeMirror-sizer{border-right:50px solid transparent;position:relative}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{display:none;outline:0;position:absolute;z-index:6}.CodeMirror-vscrollbar{overflow-x:hidden;overflow-y:scroll;right:0;top:0}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-x:scroll;overflow-y:hidden}.CodeMirror-scrollbar-filler{bottom:0;right:0}.CodeMirror-gutter-filler{bottom:0;left:0}.CodeMirror-gutters{left:0;min-height:100%;position:absolute;top:0;z-index:3}.CodeMirror-gutter{display:inline-block;height:100%;margin-bottom:-50px;vertical-align:top;white-space:normal}.CodeMirror-gutter-wrapper{background:0 0!important;border:none!important;position:absolute;z-index:4}.CodeMirror-gutter-background{bottom:0;position:absolute;top:0;z-index:4}.CodeMirror-gutter-elt{cursor:default;position:absolute;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{word-wrap:normal;-webkit-tap-highlight-color:transparent;background:0 0;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-variant-ligatures:contextual;line-height:inherit;margin:0;overflow:visible;position:relative;white-space:pre;z-index:2}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{inset:0;position:absolute;z-index:0}.CodeMirror-linewidget{padding:.1px;position:relative;z-index:2}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{height:0;overflow:hidden;position:absolute;visibility:hidden;width:100%}.CodeMirror-cursor{pointer-events:none;position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{position:relative;visibility:hidden;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:0 0}.EasyMDEContainer{display:block}.CodeMirror-rtl pre{direction:rtl}.EasyMDEContainer.sided--no-fullscreen{display:flex;flex-direction:row;flex-wrap:wrap}.EasyMDEContainer .CodeMirror{word-wrap:break-word;border:1px solid #ced4da;border-bottom-left-radius:4px;border-bottom-right-radius:4px;box-sizing:border-box;font:inherit;height:auto;padding:10px;z-index:0}.EasyMDEContainer .CodeMirror-scroll{cursor:text}.EasyMDEContainer .CodeMirror-fullscreen{background:#fff;border-bottom-right-radius:0!important;border-right:none!important;height:auto;inset:50px 0 0;position:fixed!important;z-index:8}.EasyMDEContainer .CodeMirror-sided{width:50%!important}.EasyMDEContainer.sided--no-fullscreen .CodeMirror-sided{border-bottom-right-radius:0;border-right:none!important;flex:1 1 auto;position:relative}.EasyMDEContainer .CodeMirror-placeholder{opacity:.5}.EasyMDEContainer .CodeMirror-focused .CodeMirror-selected{background:#d9d9d9}.editor-toolbar{border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-top:1px solid #ced4da;border-top-left-radius:4px;border-top-right-radius:4px;padding:9px 10px;position:relative;-webkit-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.editor-toolbar.fullscreen{background:#fff;border:0;box-sizing:border-box;height:50px;left:0;opacity:1;padding-bottom:10px;padding-top:10px;position:fixed;top:0;width:100%;z-index:9}.editor-toolbar.fullscreen:before{background:linear-gradient(90deg,#fff 0,hsla(0,0%,100%,0));height:50px;left:0;margin:0;padding:0;position:fixed;top:0;width:20px}.editor-toolbar.fullscreen:after{background:linear-gradient(90deg,hsla(0,0%,100%,0) 0,#fff);height:50px;margin:0;padding:0;position:fixed;right:0;top:0;width:20px}.EasyMDEContainer.sided--no-fullscreen .editor-toolbar{width:100%}.editor-toolbar .easymde-dropdown,.editor-toolbar button{background:0 0;border:1px solid transparent;border-radius:3px;cursor:pointer;display:inline-block;height:30px;margin:0;padding:0;text-align:center;text-decoration:none!important}.editor-toolbar button{font-weight:700;min-width:30px;padding:0 6px;white-space:nowrap}.editor-toolbar button.active,.editor-toolbar button:hover{background:#fcfcfc;border-color:#95a5a6}.editor-toolbar i.separator{border-left:1px solid #d9d9d9;border-right:1px solid #fff;color:transparent;display:inline-block;margin:0 6px;text-indent:-10px;width:0}.editor-toolbar button:after{font-family:Arial,Helvetica Neue,Helvetica,sans-serif;font-size:65%;position:relative;top:2px;vertical-align:text-bottom}.editor-toolbar button.heading-1:after{content:"1"}.editor-toolbar button.heading-2:after{content:"2"}.editor-toolbar button.heading-3:after{content:"3"}.editor-toolbar button.heading-bigger:after{content:"\25b2"}.editor-toolbar button.heading-smaller:after{content:"\25bc"}.editor-toolbar.disabled-for-preview button:not(.no-disable){opacity:.6;pointer-events:none}@media only screen and (max-width:700px){.editor-toolbar i.no-mobile{display:none}}.editor-statusbar{color:#959694;font-size:12px;padding:8px 10px;text-align:right}.EasyMDEContainer.sided--no-fullscreen .editor-statusbar{width:100%}.editor-statusbar span{display:inline-block;margin-left:1em;min-width:4em}.editor-statusbar .lines:before{content:"lines: "}.editor-statusbar .words:before{content:"words: "}.editor-statusbar .characters:before{content:"characters: "}.editor-preview-full{height:100%;left:0;position:absolute;top:0;width:100%;z-index:7}.editor-preview-full,.editor-preview-side{box-sizing:border-box;display:none;overflow:auto}.editor-preview-side{word-wrap:break-word;border:1px solid #ddd;bottom:0;position:fixed;right:0;top:50px;width:50%;z-index:9}.editor-preview-active-side{display:block}.EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side{flex:1 1 auto;height:auto;position:static}.editor-preview-active{display:block}.editor-preview{background:#fafafa;padding:10px}.editor-preview>p{margin-top:0}.editor-preview pre{background:#eee;margin-bottom:10px}.editor-preview table td,.editor-preview table th{border:1px solid #ddd;padding:5px}.cm-s-easymde .cm-tag{color:#63a35c}.cm-s-easymde .cm-attribute{color:#795da3}.cm-s-easymde .cm-string{color:#183691}.cm-s-easymde .cm-header-1{font-size:calc(1.375rem + 1.5vw)}.cm-s-easymde .cm-header-2{font-size:calc(1.325rem + .9vw)}.cm-s-easymde .cm-header-3{font-size:calc(1.3rem + .6vw)}.cm-s-easymde .cm-header-4{font-size:calc(1.275rem + .3vw)}.cm-s-easymde .cm-header-5{font-size:1.25rem}.cm-s-easymde .cm-header-6{font-size:1rem}.cm-s-easymde .cm-header-1,.cm-s-easymde .cm-header-2,.cm-s-easymde .cm-header-3,.cm-s-easymde .cm-header-4,.cm-s-easymde .cm-header-5,.cm-s-easymde .cm-header-6{line-height:1.2;margin-bottom:.5rem}.cm-s-easymde .cm-comment{background:rgba(0,0,0,.05);border-radius:2px}.cm-s-easymde .cm-link{color:#7f8c8d}.cm-s-easymde .cm-url{color:#aab2b3}.cm-s-easymde .cm-quote{color:#7f8c8d;font-style:italic}.editor-toolbar .easymde-dropdown{border:1px solid #fff;border-radius:0;position:relative}.editor-toolbar .easymde-dropdown,.editor-toolbar .easymde-dropdown:hover{background:linear-gradient(to bottom right,#fff,#fff 84%,#333 0,#333)}.easymde-dropdown-content{background-color:#f9f9f9;box-shadow:0 8px 16px #0003;display:block;padding:8px;position:absolute;top:30px;visibility:hidden;z-index:2}.easymde-dropdown:active .easymde-dropdown-content,.easymde-dropdown:focus .easymde-dropdown-content,.easymde-dropdown:focus-within .easymde-dropdown-content{visibility:visible}.easymde-dropdown-content button{display:block}span[data-img-src]:after{background-image:var(--bg-image);background-repeat:no-repeat;background-size:contain;content:"";display:block;height:0;max-height:100%;max-width:100%;padding-top:var(--height);width:var(--width)}.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:rgba(255,0,0,.15)}:root{--color-cm-red:#991b1b;--color-cm-orange:#9a3412;--color-cm-amber:#92400e;--color-cm-yellow:#854d0e;--color-cm-lime:#3f6212;--color-cm-green:#166534;--color-cm-emerald:#065f46;--color-cm-teal:#115e59;--color-cm-cyan:#155e75;--color-cm-sky:#075985;--color-cm-blue:#1e40af;--color-cm-indigo:#3730a3;--color-cm-violet:#5b21b6;--color-cm-purple:#6b21a8;--color-cm-fuchsia:#86198f;--color-cm-pink:#9d174d;--color-cm-rose:#9f1239;--color-cm-gray:#18181b;--color-cm-gray-muted:#71717a;--color-cm-gray-background:#e4e4e7}.dark{--color-cm-red:#f87171;--color-cm-orange:#fb923c;--color-cm-amber:#fbbf24;--color-cm-yellow:#facc15;--color-cm-lime:#a3e635;--color-cm-green:#4ade80;--color-cm-emerald:#4ade80;--color-cm-teal:#2dd4bf;--color-cm-cyan:#22d3ee;--color-cm-sky:#38bdf8;--color-cm-blue:#60a5fa;--color-cm-indigo:#818cf8;--color-cm-violet:#a78bfa;--color-cm-purple:#c084fc;--color-cm-fuchsia:#e879f9;--color-cm-pink:#f472b6;--color-cm-rose:#fb7185;--color-cm-gray:#fafafa;--color-cm-gray-muted:#a1a1aa;--color-cm-gray-background:#52525b}.cm-s-easymde .cm-comment{background-color:transparent;color:var(--color-cm-gray-muted)}.EasyMDEContainer .CodeMirror-cursor{border-color:currentColor}.dark .EasyMDEContainer .cm-s-easymde span.CodeMirror-selectedtext{filter:invert(100%)}.EasyMDEContainer .cm-s-easymde .cm-keyword{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-atom{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-number{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-def{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable{color:var(--color-cm-yellow)}.EasyMDEContainer .cm-s-easymde .cm-variable-2{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-variable-3{color:var(--color-cm-emerald)}.EasyMDEContainer .cm-s-easymde .cm-operator,.EasyMDEContainer .cm-s-easymde .cm-property{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-string,.EasyMDEContainer .cm-s-easymde .cm-string-2{color:var(--color-cm-rose)}.EasyMDEContainer .cm-s-easymde .cm-meta{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-error{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-qualifier{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-builtin{color:var(--color-cm-violet)}.EasyMDEContainer .cm-s-easymde .cm-bracket{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-hr{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote{color:var(--color-cm-sky)}.EasyMDEContainer .cm-s-easymde .cm-formatting-quote+.cm-quote{color:var(--color-cm-gray-muted)}.EasyMDEContainer .cm-s-easymde .cm-formatting-list,.EasyMDEContainer .cm-s-easymde .cm-formatting-list+.cm-variable-2,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-variable-2{color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-link{color:var(--color-cm-blue)}.EasyMDEContainer .cm-s-easymde .cm-tag{color:var(--color-cm-red)}.EasyMDEContainer .cm-s-easymde .cm-attribute{color:var(--color-cm-amber)}.EasyMDEContainer .cm-s-easymde .cm-attribute+.cm-string{color:var(--color-cm-green)}.EasyMDEContainer .cm-s-easymde .cm-formatting-code+.cm-comment:not(.cm-formatting-code){background-color:var(--color-cm-gray-background);color:var(--color-cm-gray)}.EasyMDEContainer .cm-s-easymde .cm-header-1{font-size:1.875rem;line-height:2.25rem}.EasyMDEContainer .cm-s-easymde .cm-header-2{font-size:1.5rem;line-height:2rem}.EasyMDEContainer .cm-s-easymde .cm-header-3{font-size:1.25rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-4{font-size:1.125rem;line-height:1.75rem}.EasyMDEContainer .cm-s-easymde .cm-header-5{font-size:1rem;line-height:1.5rem}.EasyMDEContainer .cm-s-easymde .cm-header-6{font-size:.875rem;line-height:1.25rem}.EasyMDEContainer .cm-s-easymde .cm-comment{background-image:none}.EasyMDEContainer .CodeMirror,.EasyMDEContainer .cm-s-easymde .cm-formatting-code-block,.EasyMDEContainer .cm-s-easymde .cm-tab+.cm-comment{background-color:transparent;color:inherit}.EasyMDEContainer .CodeMirror{border-style:none;padding:.375rem .75rem}.EasyMDEContainer .CodeMirror-scroll{height:auto}.EasyMDEContainer .editor-toolbar{--tw-border-opacity:1;border-color:rgba(var(--gray-200),var(--tw-border-opacity));border-radius:0;border-width:0 0 1px;-moz-column-gap:.25rem;column-gap:.25rem;display:flex;overflow-x:auto;padding:.5rem .625rem}.EasyMDEContainer .editor-toolbar:is(.dark *){border-color:hsla(0,0%,100%,.1)}.EasyMDEContainer .editor-toolbar button{border-radius:.5rem;border-style:none;cursor:pointer;display:grid;height:2rem;padding:0;place-content:center;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}.EasyMDEContainer .editor-toolbar button:hover{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button:focus-visible{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button:hover:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:focus-visible:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button.active{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *){background-color:hsla(0,0%,100%,.05)}.EasyMDEContainer .editor-toolbar button:before{--tw-bg-opacity:1;background-color:rgba(var(--gray-700),var(--tw-bg-opacity));display:block;height:1.25rem;width:1.25rem}.EasyMDEContainer .editor-toolbar button:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--gray-300),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button:before{content:"";-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.EasyMDEContainer .editor-toolbar button.active:before{--tw-bg-opacity:1;background-color:rgba(var(--primary-600),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar button.active:is(.dark *):before{--tw-bg-opacity:1;background-color:rgba(var(--primary-400),var(--tw-bg-opacity))}.EasyMDEContainer .editor-toolbar .separator{border-style:none;margin:0!important;width:.25rem}.EasyMDEContainer .editor-toolbar .bold:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M4 3a1 1 0 0 1 1-1h6a4.5 4.5 0 0 1 3.274 7.587A4.75 4.75 0 0 1 11.25 18H5a1 1 0 0 1-1-1V3Zm2.5 5.5v-4H11a2 2 0 1 1 0 4H6.5Zm0 2.5v4.5h4.75a2.25 2.25 0 0 0 0-4.5H6.5Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .italic:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M8 2.75A.75.75 0 0 1 8.75 2h7.5a.75.75 0 0 1 0 1.5h-3.215l-4.483 13h2.698a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5h3.215l4.483-13H8.75A.75.75 0 0 1 8 2.75Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .strikethrough:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M11.617 3.963c-1.186-.318-2.418-.323-3.416.015-.992.336-1.49.91-1.642 1.476-.152.566-.007 1.313.684 2.1.528.6 1.273 1.1 2.128 1.446h7.879a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.813a5.976 5.976 0 0 1-.447-.456C5.18 7.479 4.798 6.231 5.11 5.066c.312-1.164 1.268-2.055 2.61-2.509 1.336-.451 2.877-.42 4.286-.043.856.23 1.684.592 2.409 1.074a.75.75 0 1 1-.83 1.25 6.723 6.723 0 0 0-1.968-.875Zm1.909 8.123a.75.75 0 0 1 1.015.309c.53.99.607 2.062.18 3.01-.421.94-1.289 1.648-2.441 2.038-1.336.452-2.877.42-4.286.043-1.409-.377-2.759-1.121-3.69-2.18a.75.75 0 1 1 1.127-.99c.696.791 1.765 1.403 2.952 1.721 1.186.318 2.418.323 3.416-.015.853-.288 1.34-.756 1.555-1.232.21-.467.205-1.049-.136-1.69a.75.75 0 0 1 .308-1.014Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .link:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z'/%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z'/%3E%3Cpath d='M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .heading:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4ZM13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M2.75 4a.75.75 0 0 1 .75.75v4.5h5v-4.5a.75.75 0 0 1 1.5 0v10.5a.75.75 0 0 1-1.5 0v-4.5h-5v4.5a.75.75 0 0 1-1.5 0V4.75A.75.75 0 0 1 2.75 4ZM13 8.75a.75.75 0 0 1 .75-.75h1.75a.75.75 0 0 1 .75.75v5.75h1a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5h1v-5h-1a.75.75 0 0 1-.75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .quote:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M10 2c-2.236 0-4.43.18-6.57.524C1.993 2.755 1 4.014 1 5.426v5.148c0 1.413.993 2.67 2.43 2.902 1.168.188 2.352.327 3.55.414.28.02.521.18.642.413l1.713 3.293a.75.75 0 0 0 1.33 0l1.713-3.293a.783.783 0 0 1 .642-.413 41.102 41.102 0 0 0 3.55-.414c1.437-.231 2.43-1.49 2.43-2.902V5.426c0-1.413-.993-2.67-2.43-2.902A41.289 41.289 0 0 0 10 2ZM6.75 6a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5h-6.5Zm0 2.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .code:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06Zm-2.343-3.209a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6.28 5.22a.75.75 0 0 1 0 1.06L2.56 10l3.72 3.72a.75.75 0 0 1-1.06 1.06L.97 10.53a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Zm7.44 0a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L17.44 10l-3.72-3.72a.75.75 0 0 1 0-1.06Zm-2.343-3.209a.75.75 0 0 1 .612.867l-2.5 14.5a.75.75 0 0 1-1.478-.255l2.5-14.5a.75.75 0 0 1 .866-.612Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .unordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0 10.5a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0-5.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M6 4.75A.75.75 0 0 1 6.75 4h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 4.75ZM6 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75A.75.75 0 0 1 6 10Zm0 5.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75ZM1.99 4.75a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0 10.5a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1v-.01Zm0-5.25a1 1 0 0 1 1-1H3a1 1 0 0 1 1 1v.01a1 1 0 0 1-1 1h-.01a1 1 0 0 1-1-1V10Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .ordered-list:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3Zm-.03 7.404a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm-5.125-1.625a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath d='M3 1.25a.75.75 0 0 0 0 1.5h.25v2.5a.75.75 0 0 0 1.5 0V2A.75.75 0 0 0 4 1.25H3Zm-.03 7.404a3.5 3.5 0 0 1 1.524-.12.034.034 0 0 1-.012.012L2.415 9.579A.75.75 0 0 0 2 10.25v1c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H3.927l1.225-.613c.52-.26.848-.79.848-1.371 0-.647-.429-1.327-1.193-1.451a5.03 5.03 0 0 0-2.277.155.75.75 0 0 0 .44 1.434ZM7.75 3a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm0 6.25a.75.75 0 0 0 0 1.5h9.5a.75.75 0 0 0 0-1.5h-9.5Zm-5.125-1.625a.75.75 0 0 0 0 1.5h1.5a.125.125 0 0 1 0 .25H3.5a.75.75 0 0 0 0 1.5h.625a.125.125 0 0 1 0 .25h-1.5a.75.75 0 0 0 0 1.5h1.5a1.625 1.625 0 0 0 1.37-2.5 1.625 1.625 0 0 0-1.37-2.5h-1.5Z'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .table:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M.99 5.24A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25l.01 9.5A2.25 2.25 0 0 1 16.76 17H3.26A2.267 2.267 0 0 1 1 14.74l-.01-9.5Zm8.26 9.52v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.615c0 .414.336.75.75.75h5.373a.75.75 0 0 0 .627-.74Zm1.5 0a.75.75 0 0 0 .627.74h5.373a.75.75 0 0 0 .75-.75v-.615a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625Zm6.75-3.63v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75v.625c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75ZM17.5 7.5v-.625a.75.75 0 0 0-.75-.75H11.5a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75h5.25a.75.75 0 0 0 .75-.75Zm-8.25 0v-.625a.75.75 0 0 0-.75-.75H3.25a.75.75 0 0 0-.75.75V7.5c0 .414.336.75.75.75H8.5a.75.75 0 0 0 .75-.75Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .upload-image:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .undo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M7.793 2.232a.75.75 0 0 1-.025 1.06L3.622 7.25h10.003a5.375 5.375 0 0 1 0 10.75H10.75a.75.75 0 0 1 0-1.5h2.875a3.875 3.875 0 0 0 0-7.75H3.622l4.146 3.957a.75.75 0 0 1-1.036 1.085l-5.5-5.25a.75.75 0 0 1 0-1.085l5.5-5.25a.75.75 0 0 1 1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-toolbar .redo:before{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='size-5'%3E%3Cpath fill-rule='evenodd' d='M12.207 2.232a.75.75 0 0 0 .025 1.06l4.146 3.958H6.375a5.375 5.375 0 0 0 0 10.75H9.25a.75.75 0 0 0 0-1.5H6.375a3.875 3.875 0 0 1 0-7.75h10.003l-4.146 3.957a.75.75 0 0 0 1.036 1.085l5.5-5.25a.75.75 0 0 0 0-1.085l-5.5-5.25a.75.75 0 0 0-1.06.025Z' clip-rule='evenodd'/%3E%3C/svg%3E")}.EasyMDEContainer .editor-statusbar{display:none}.fi-fo-rich-editor trix-toolbar .trix-dialogs{position:relative}.fi-fo-rich-editor trix-toolbar .trix-dialog{--tw-bg-opacity:1;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgba(var(--gray-50),var(--tw-bg-opacity));border-radius:.5rem;bottom:auto;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);left:0;padding:.5rem;position:absolute;right:0;top:1rem}.fi-fo-rich-editor trix-toolbar .trix-dialog:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields{display:flex;flex-direction:column;gap:.5rem;width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group{display:flex;gap:.5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--gray-950),0.1);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;border-style:none;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--gray-950),var(--tw-text-opacity));display:block;font-size:.875rem;line-height:1.25rem;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:.75rem;padding-top:.375rem;padding-inline-start:.75rem;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-color:hsla(0,0%,100%,.2);background-color:rgba(var(--gray-700),var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input:focus-within:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgba(var(--primary-600),var(--tw-ring-opacity))}@media (min-width:640px){.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-input{font-size:.875rem;line-height:1.5rem}}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button{--tw-bg-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-200),var(--tw-ring-opacity));background-color:rgba(var(--gray-50),var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);font-size:.75rem;line-height:1rem;padding:.125rem .5rem}.fi-fo-rich-editor trix-toolbar .trix-dialog__link-fields .trix-button-group .trix-button:is(.dark *){--tw-bg-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgba(var(--gray-600),var(--tw-ring-opacity));background-color:rgba(var(--gray-700),var(--tw-bg-opacity))}.fi-fo-rich-editor trix-editor:empty:before{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.fi-fo-rich-editor trix-editor:empty:is(.dark *):before{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.fi-fo-rich-editor trix-editor:empty:before{content:attr(placeholder)}.fi-fo-rich-editor trix-editor.prose :where(ol):not(:where([class~=not-prose] *)),.fi-fo-rich-editor trix-editor.prose :where(ul):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:1.625em!important}.fi-fo-rich-editor trix-editor.prose :where(ul>li):not(:where([class~=not-prose] *)){padding-inline-end:0!important;padding-inline-start:.375em!important}select:not(.choices){background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E")}[dir=rtl] select{background-position:left .5rem center!important}.choices{outline:2px solid transparent;outline-offset:2px;position:relative}.choices [hidden]{display:none!important}.choices[data-type*=select-one] .has-no-choices{display:none}.choices[data-type*=select-one] .choices__input{display:block;margin:0;width:100%}.choices__inner{background-repeat:no-repeat;outline:2px solid transparent;outline-offset:2px;padding-bottom:.375rem;padding-inline-end:2rem;padding-top:.375rem;padding-inline-start:.75rem}@media (min-width:640px){.choices__inner{font-size:.875rem;line-height:1.5rem}}.choices__inner{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-size:1.5em 1.5em}.choices.is-disabled .choices__inner{cursor:default}[dir=rtl] .choices__inner{background-position:left .5rem center}.choices__list--single{display:inline-block}.choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-950),var(--tw-text-opacity))}.choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.choices.is-disabled .choices__list--single .choices__item{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices.is-disabled .choices__list--single .choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__list--multiple{display:flex;flex-wrap:wrap;gap:.375rem}.choices__list--multiple:not(:empty){margin-bottom:.25rem;margin-left:-.25rem;margin-right:-.25rem;padding-bottom:.125rem;padding-top:.125rem}.choices__list--multiple .choices__item{--tw-bg-opacity:1;--tw-text-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-inset:inset;--tw-ring-color:rgba(var(--primary-600),0.1);align-items:center;background-color:rgba(var(--primary-50),var(--tw-bg-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:rgba(var(--primary-600),var(--tw-text-opacity));display:inline-flex;font-size:.75rem;font-weight:500;gap:.25rem;line-height:1rem;padding:.25rem .5rem;word-break:break-all}.choices__list--multiple .choices__item:is(.dark *){--tw-text-opacity:1;--tw-ring-color:rgba(var(--primary-400),0.3);background-color:rgba(var(--primary-400),.1);color:rgba(var(--primary-400),var(--tw-text-opacity))}.choices__list--dropdown,.choices__list[aria-expanded]{--tw-bg-opacity:1;--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--gray-950),0.05);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.5rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:none;font-size:.875rem;line-height:1.25rem;margin-top:.5rem;overflow:hidden;overflow-wrap:break-word;position:absolute;top:100%;width:100%;will-change:visibility;z-index:10}.choices__list--dropdown:is(.dark *),.choices__list[aria-expanded]:is(.dark *){--tw-bg-opacity:1;--tw-ring-color:hsla(0,0%,100%,.1);background-color:rgba(var(--gray-900),var(--tw-bg-opacity))}.is-active.choices__list--dropdown,.is-active.choices__list[aria-expanded]{display:block;padding:.25rem}.choices__list--dropdown .choices__list,.choices__list[aria-expanded] .choices__list{max-height:15rem;overflow:auto;will-change:scroll-position}.choices__item--choice{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity));padding:.5rem;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.choices__item--choice:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__item--choice.choices__item--selectable{--tw-text-opacity:1;border-radius:.375rem;color:rgba(var(--gray-950),var(--tw-text-opacity))}.choices__item--choice.choices__item--selectable:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.choices__list--dropdown .choices__item--selectable.is-highlighted,.choices__list[aria-expanded] .choices__item--selectable.is-highlighted{--tw-bg-opacity:1;background-color:rgba(var(--gray-50),var(--tw-bg-opacity))}.choices__list--dropdown .choices__item--selectable.is-highlighted:is(.dark *),.choices__list[aria-expanded] .choices__item--selectable.is-highlighted:is(.dark *){background-color:hsla(0,0%,100%,.05)}.choices__item{cursor:default}.choices__item--disabled{pointer-events:none}.choices__item--disabled:disabled{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__item--disabled:disabled:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices.is-disabled .choices__placeholder.choices__item,.choices__placeholder.choices__item{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity));cursor:default}.choices.is-disabled .choices__placeholder.choices__item:is(.dark *),.choices__placeholder.choices__item:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__button{background-color:transparent;background-position:50%;background-repeat:no-repeat;border-width:0;outline:2px solid transparent;outline-offset:2px;text-indent:-9999px}.choices[data-type*=select-one] .choices__button{height:1rem;inset-inline-end:0;margin-inline-end:2.25rem;opacity:.5;padding:0;position:absolute;transition-duration:75ms;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.choices[data-type*=select-one] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em;top:calc(50% - .5714em)}.dark .choices[data-type*=select-one] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button{height:1rem;opacity:.5;width:1rem}.choices[data-type*=select-multiple] .choices__button:is(.dark *){opacity:.4}.choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=);background-size:.7142em .7142em}.dark .choices[data-type*=select-multiple] .choices__button{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJtMi41OTIuMDQ0IDE4LjM2NCAxOC4zNjQtMi41NDggMi41NDhMLjA0NCAyLjU5MnoiLz48cGF0aCBkPSJNMCAxOC4zNjQgMTguMzY0IDBsMi41NDggMi41NDhMMi41NDggMjAuOTEyeiIvPjwvZz48L3N2Zz4=)}.choices[data-type*=select-multiple] .choices__button:focus-visible,.choices[data-type*=select-multiple] .choices__button:hover,.choices[data-type*=select-one] .choices__button:focus-visible,.choices[data-type*=select-one] .choices__button:hover{opacity:.7}.choices[data-type*=select-multiple] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-multiple] .choices__button:hover:is(.dark *),.choices[data-type*=select-one] .choices__button:focus-visible:is(.dark *),.choices[data-type*=select-one] .choices__button:hover:is(.dark *){opacity:.6}.choices.is-disabled .choices__button,.choices[data-type*=select-one] .choices__item[data-value=""] .choices__button{display:none}.choices__input{--tw-text-opacity:1;background-color:transparent!important;border-style:none;color:rgba(var(--gray-950),var(--tw-text-opacity));font-size:1rem!important;line-height:1.5rem!important;padding:0!important;transition-duration:75ms;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.choices__input::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__input::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.choices__input:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.choices__input:disabled{--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-500),1);color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__input:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.choices__input:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__input:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.choices__input:disabled:is(.dark *){--tw-text-opacity:1;-webkit-text-fill-color:rgba(var(--gray-400),1);color:rgba(var(--gray-400),var(--tw-text-opacity))}@media (min-width:640px){.choices__input{font-size:.875rem!important;line-height:1.5rem}}.choices__list--dropdown .choices__input{padding:.5rem!important}.choices__input::-webkit-search-cancel-button,.choices__input::-webkit-search-decoration,.choices__input::-webkit-search-results-button,.choices__input::-webkit-search-results-decoration{display:none}.choices__input::-ms-clear,.choices__input::-ms-reveal{display:none;height:0;width:0}.choices__group{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity));padding:1rem .5rem .5rem}.choices__group:first-child{padding-top:.5rem}.choices__group:is(.dark *){--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.webkit-calendar-picker-indicator\:opacity-0::-webkit-calendar-picker-indicator{opacity:0}/*! Bundled license information: cropperjs/dist/cropper.min.css: (*! From 4daa57ce8fab19ad5beaf0ccc8453f67c51e75c8 Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 13:16:37 +0100 Subject: [PATCH 07/19] ... --- .blueprint | 43 +++++++------- .../Owner/Resources/GoldenProductResource.php | 3 +- .../Pages/EditGoldenProduct.php | 5 ++ .../SellerProductsRelationManager.php | 58 +++++++++++++++++++ app/Models/GoldenProduct.php | 5 ++ app/Models/SellerProduct.php | 7 +++ database/factories/SellerProductFactory.php | 2 + ...2024_12_03_124252_create_sellers_table.php | 29 ---------- ...12_03_124253_create_partnerships_table.php | 36 ------------ ..._12_03_124254_create_seller_data_table.php | 52 ----------------- ...4_12_03_124255_create_categories_table.php | 35 ----------- ...03_124256_create_seller_products_table.php | 44 -------------- ...257_create_seller_product_images_table.php | 35 ----------- ...03_124258_create_seller_variants_table.php | 38 ------------ .../2024_12_03_124259_create_prices_table.php | 35 ----------- .../2024_12_03_124300_create_stocks_table.php | 38 ------------ ...24_12_03_124301_create_locations_table.php | 35 ----------- ...4_12_03_124302_create_currencies_table.php | 35 ----------- ...024_12_03_124303_create_messages_table.php | 34 ----------- ...2_03_124304_create_product_types_table.php | 32 ---------- ...5_create_product_type_attributes_table.php | 43 -------------- ...03_124306_create_golden_products_table.php | 32 ---------- ...create_golden_product_localizeds_table.php | 37 ------------ ...2024_12_03_124308_create_locales_table.php | 34 ----------- .../2024_12_03_124309_create_orders_table.php | 37 ------------ ..._12_03_124310_create_order_items_table.php | 36 ------------ ..._12_03_124311_create_seller_user_table.php | 31 ---------- ...024_12_04_120427_create_sellers_table.php} | 0 ...2_04_120428_create_partnerships_table.php} | 0 ...12_04_120429_create_seller_data_table.php} | 0 ..._12_04_120430_create_categories_table.php} | 0 ...4_120431_create_seller_products_table.php} | 1 + ...32_create_seller_product_images_table.php} | 0 ...4_120433_create_seller_variants_table.php} | 0 ...2024_12_04_120434_create_prices_table.php} | 0 ...2024_12_04_120435_create_stocks_table.php} | 0 ...4_12_04_120436_create_locations_table.php} | 0 ..._12_04_120437_create_currencies_table.php} | 0 ...24_12_04_120438_create_messages_table.php} | 0 ..._04_120439_create_product_types_table.php} | 0 ..._create_product_type_attributes_table.php} | 0 ...4_120441_create_golden_products_table.php} | 0 ...reate_golden_product_localizeds_table.php} | 0 ...024_12_04_120443_create_locales_table.php} | 0 ...12_04_120444_create_seller_user_table.php} | 0 database/seeders/DatabaseSeeder.php | 16 ++++- draft.yaml | 4 +- 47 files changed, 120 insertions(+), 752 deletions(-) create mode 100644 app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php delete mode 100644 database/migrations/2024_12_03_124252_create_sellers_table.php delete mode 100644 database/migrations/2024_12_03_124253_create_partnerships_table.php delete mode 100644 database/migrations/2024_12_03_124254_create_seller_data_table.php delete mode 100644 database/migrations/2024_12_03_124255_create_categories_table.php delete mode 100644 database/migrations/2024_12_03_124256_create_seller_products_table.php delete mode 100644 database/migrations/2024_12_03_124257_create_seller_product_images_table.php delete mode 100644 database/migrations/2024_12_03_124258_create_seller_variants_table.php delete mode 100644 database/migrations/2024_12_03_124259_create_prices_table.php delete mode 100644 database/migrations/2024_12_03_124300_create_stocks_table.php delete mode 100644 database/migrations/2024_12_03_124301_create_locations_table.php delete mode 100644 database/migrations/2024_12_03_124302_create_currencies_table.php delete mode 100644 database/migrations/2024_12_03_124303_create_messages_table.php delete mode 100644 database/migrations/2024_12_03_124304_create_product_types_table.php delete mode 100644 database/migrations/2024_12_03_124305_create_product_type_attributes_table.php delete mode 100644 database/migrations/2024_12_03_124306_create_golden_products_table.php delete mode 100644 database/migrations/2024_12_03_124307_create_golden_product_localizeds_table.php delete mode 100644 database/migrations/2024_12_03_124308_create_locales_table.php delete mode 100644 database/migrations/2024_12_03_124309_create_orders_table.php delete mode 100644 database/migrations/2024_12_03_124310_create_order_items_table.php delete mode 100644 database/migrations/2024_12_03_124311_create_seller_user_table.php rename database/migrations/{2024_12_02_185412_create_sellers_table.php => 2024_12_04_120427_create_sellers_table.php} (100%) rename database/migrations/{2024_12_02_185413_create_partnerships_table.php => 2024_12_04_120428_create_partnerships_table.php} (100%) rename database/migrations/{2024_12_02_185414_create_seller_data_table.php => 2024_12_04_120429_create_seller_data_table.php} (100%) rename database/migrations/{2024_12_02_185415_create_categories_table.php => 2024_12_04_120430_create_categories_table.php} (100%) rename database/migrations/{2024_12_02_185416_create_seller_products_table.php => 2024_12_04_120431_create_seller_products_table.php} (92%) rename database/migrations/{2024_12_02_185417_create_seller_product_images_table.php => 2024_12_04_120432_create_seller_product_images_table.php} (100%) rename database/migrations/{2024_12_02_185418_create_seller_variants_table.php => 2024_12_04_120433_create_seller_variants_table.php} (100%) rename database/migrations/{2024_12_02_185419_create_prices_table.php => 2024_12_04_120434_create_prices_table.php} (100%) rename database/migrations/{2024_12_02_185420_create_stocks_table.php => 2024_12_04_120435_create_stocks_table.php} (100%) rename database/migrations/{2024_12_02_185421_create_locations_table.php => 2024_12_04_120436_create_locations_table.php} (100%) rename database/migrations/{2024_12_02_185422_create_currencies_table.php => 2024_12_04_120437_create_currencies_table.php} (100%) rename database/migrations/{2024_12_02_185423_create_messages_table.php => 2024_12_04_120438_create_messages_table.php} (100%) rename database/migrations/{2024_12_02_185424_create_product_types_table.php => 2024_12_04_120439_create_product_types_table.php} (100%) rename database/migrations/{2024_12_02_185425_create_product_type_attributes_table.php => 2024_12_04_120440_create_product_type_attributes_table.php} (100%) rename database/migrations/{2024_12_02_185426_create_golden_products_table.php => 2024_12_04_120441_create_golden_products_table.php} (100%) rename database/migrations/{2024_12_02_185427_create_golden_product_localizeds_table.php => 2024_12_04_120442_create_golden_product_localizeds_table.php} (100%) rename database/migrations/{2024_12_02_185428_create_locales_table.php => 2024_12_04_120443_create_locales_table.php} (100%) rename database/migrations/{2024_12_02_185429_create_seller_user_table.php => 2024_12_04_120444_create_seller_user_table.php} (100%) diff --git a/.blueprint b/.blueprint index dda78e5..bd98538 100644 --- a/.blueprint +++ b/.blueprint @@ -16,24 +16,24 @@ created: - database/factories/GoldenProductFactory.php - database/factories/GoldenProductLocalizedFactory.php - database/factories/LocaleFactory.php - - database/migrations/2024_12_02_185412_create_sellers_table.php - - database/migrations/2024_12_02_185413_create_partnerships_table.php - - database/migrations/2024_12_02_185414_create_seller_data_table.php - - database/migrations/2024_12_02_185415_create_categories_table.php - - database/migrations/2024_12_02_185416_create_seller_products_table.php - - database/migrations/2024_12_02_185417_create_seller_product_images_table.php - - database/migrations/2024_12_02_185418_create_seller_variants_table.php - - database/migrations/2024_12_02_185419_create_prices_table.php - - database/migrations/2024_12_02_185420_create_stocks_table.php - - database/migrations/2024_12_02_185421_create_locations_table.php - - database/migrations/2024_12_02_185422_create_currencies_table.php - - database/migrations/2024_12_02_185423_create_messages_table.php - - database/migrations/2024_12_02_185424_create_product_types_table.php - - database/migrations/2024_12_02_185425_create_product_type_attributes_table.php - - database/migrations/2024_12_02_185426_create_golden_products_table.php - - database/migrations/2024_12_02_185427_create_golden_product_localizeds_table.php - - database/migrations/2024_12_02_185428_create_locales_table.php - - database/migrations/2024_12_02_185429_create_seller_user_table.php + - database/migrations/2024_12_04_120427_create_sellers_table.php + - database/migrations/2024_12_04_120428_create_partnerships_table.php + - database/migrations/2024_12_04_120429_create_seller_data_table.php + - database/migrations/2024_12_04_120430_create_categories_table.php + - database/migrations/2024_12_04_120431_create_seller_products_table.php + - database/migrations/2024_12_04_120432_create_seller_product_images_table.php + - database/migrations/2024_12_04_120433_create_seller_variants_table.php + - database/migrations/2024_12_04_120434_create_prices_table.php + - database/migrations/2024_12_04_120435_create_stocks_table.php + - database/migrations/2024_12_04_120436_create_locations_table.php + - database/migrations/2024_12_04_120437_create_currencies_table.php + - database/migrations/2024_12_04_120438_create_messages_table.php + - database/migrations/2024_12_04_120439_create_product_types_table.php + - database/migrations/2024_12_04_120440_create_product_type_attributes_table.php + - database/migrations/2024_12_04_120441_create_golden_products_table.php + - database/migrations/2024_12_04_120442_create_golden_product_localizeds_table.php + - database/migrations/2024_12_04_120443_create_locales_table.php + - database/migrations/2024_12_04_120444_create_seller_user_table.php - app/Models/Seller.php - app/Models/Partnership.php - app/Models/SellerData.php @@ -52,12 +52,15 @@ created: - app/Models/GoldenProductLocalized.php - app/Models/Locale.php models: + Customer: { } + Order: { } + OrderItem: { } User: { name: string, email: string, is_seller: "boolean default:'0'", email_verified_at: 'datetime nullable', password: string, remember_token: 'string nullable' } Seller: { name: string, hideProducts: 'boolean default:false', relationships: { belongsToMany: User, hasOne: 'SellerData, Partnership', hasMany: 'SellerProduct, SellerVariant, Price, Stock, Location, Message' } } Partnership: { seller_id: 'id foreign', status: 'enum:submitted,accepted,rejected,review default:submitted', rejection_reason: 'text nullable', notes: 'text nullable', select_all_products: 'boolean default:false' } SellerData: { seller_id: 'id foreign', email: 'string nullable', description: 'text nullable', company_name: 'string nullable', address_line1: 'string nullable', address_line2: 'string nullable', city: 'string nullable', state: 'string nullable', postal_code: 'string nullable', country_code: 'string nullable', phone: 'string nullable', vat: 'string nullable', tin: 'string nullable', eori: 'string nullable', iban: 'string nullable', swift_bic: 'string nullable', bank_name: 'string nullable', account_holder_name: 'string nullable', file1: 'string nullable', file2: 'string nullable', file3: 'string nullable' } Category: { name: string, description: 'text nullable', is_active: 'boolean nullable', parent_id: 'id foreign:categories.id nullable', relationships: { hasMany: SellerProduct } } - SellerProduct: { name: string, brand: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', category_id: 'id foreign nullable', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', selected: 'boolean default:false', ean: 'string nullable', upc: 'string nullable', gtin_14: 'string nullable', gtin_8: 'string nullable', relationships: { hasMany: 'SellerVariant,Price,Stock,SellerProductImage:image' } } + SellerProduct: { name: string, brand: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', category_id: 'id foreign nullable', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', selected: 'boolean default:false', ean: 'string nullable', upc: 'string nullable', gtin_14: 'string nullable', gtin_8: 'string nullable', golden_product_id: 'id foreign nullable', relationships: { hasMany: 'SellerVariant,Price,Stock,SellerProductImage:image' } } SellerProductImage: { seller_product_id: 'id foreign', seller_variant_id: 'id foreign nullable', image: string, number: 'integer default:1' } SellerVariant: { name: string, sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', seller_product_id: 'id foreign', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', relationships: { hasMany: 'Price, Stock, SellerProductImage:image' } } Price: { amount: integer, seller_variant_id: 'id foreign nullable', seller_product_id: 'id foreign', currency_id: 'id foreign' } @@ -67,6 +70,6 @@ models: Message: { content: text, seller_id: 'id foreign', message_id: 'id foreign nullable' } ProductType: { name: string, relationships: { hasMany: 'ProductTypeAttribute:attribute, GoldenProduct:product' } } ProductTypeAttribute: { name: string, type: 'enum:text,boolean,number,select,url,color', is_translatable: 'boolean default:false', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', options: 'json nullable', validators: 'json nullable', product_type_id: 'id foreign' } - GoldenProduct: { product_type_id: 'id foreign', relationships: { hasMany: 'GoldenProductLocalized:translation' } } + GoldenProduct: { product_type_id: 'id foreign', relationships: { hasMany: 'GoldenProductLocalized:translation, SellerProduct' } } GoldenProductLocalized: { name: string, description: 'text nullable', attributes: 'json nullable', product_type_id: 'id foreign', locale_id: 'id foreign', golden_product_id: 'id foreign' } Locale: { code: string, name: string, default: boolean } diff --git a/app/Filament/Owner/Resources/GoldenProductResource.php b/app/Filament/Owner/Resources/GoldenProductResource.php index 4223f27..dd86e1a 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource.php +++ b/app/Filament/Owner/Resources/GoldenProductResource.php @@ -20,6 +20,7 @@ use Illuminate\Database\Eloquent\SoftDeletingScope; use Illuminate\Support\Collection; use App\Models\Locale; +use App\Filament\Owner\Resources\GoldenProductResource\RelationManagers\SellerProductsRelationManager; class GoldenProductResource extends Resource { @@ -332,7 +333,7 @@ public static function table(Table $table): Table public static function getRelations(): array { return [ - // + SellerProductsRelationManager::class, ]; } diff --git a/app/Filament/Owner/Resources/GoldenProductResource/Pages/EditGoldenProduct.php b/app/Filament/Owner/Resources/GoldenProductResource/Pages/EditGoldenProduct.php index 6ae3643..07c892e 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource/Pages/EditGoldenProduct.php +++ b/app/Filament/Owner/Resources/GoldenProductResource/Pages/EditGoldenProduct.php @@ -38,4 +38,9 @@ protected function handleRecordUpdate(Model $record, array $data): Model return $record; } + + public function hasCombinedRelationManagerTabsWithContent(): bool + { + return true; + } } diff --git a/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php b/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php new file mode 100644 index 0000000..28423f9 --- /dev/null +++ b/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php @@ -0,0 +1,58 @@ +schema([ + Forms\Components\TextInput::make('name') + ->required() + ->maxLength(255), + Forms\Components\TextInput::make('brand') + ->maxLength(255), + Forms\Components\TextInput::make('sku') + ->maxLength(255), + Forms\Components\Textarea::make('description') + ->maxLength(65535), + Forms\Components\KeyValue::make('attributes'), + ]); + } + + public function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('name') + ->searchable(), + Tables\Columns\TextColumn::make('brand') + ->searchable(), + Tables\Columns\TextColumn::make('sku') + ->searchable(), + Tables\Columns\TextColumn::make('seller.name') + ->label('Seller') + ->searchable(), + ]) + ->filters([ + // + ]) + ->actions([ + Tables\Actions\ViewAction::make(), + ]) + ->bulkActions([ + // + ]); + } +} diff --git a/app/Models/GoldenProduct.php b/app/Models/GoldenProduct.php index fcd612a..1d904d0 100644 --- a/app/Models/GoldenProduct.php +++ b/app/Models/GoldenProduct.php @@ -35,6 +35,11 @@ public function translations(): HasMany return $this->hasMany(GoldenProductLocalized::class); } + public function sellerProducts(): HasMany + { + return $this->hasMany(SellerProduct::class); + } + public function productType(): BelongsTo { return $this->belongsTo(ProductType::class); diff --git a/app/Models/SellerProduct.php b/app/Models/SellerProduct.php index eca7cf4..58e46a9 100644 --- a/app/Models/SellerProduct.php +++ b/app/Models/SellerProduct.php @@ -30,6 +30,7 @@ class SellerProduct extends Model 'upc', 'gtin_14', 'gtin_8', + 'golden_product_id', ]; /** @@ -43,6 +44,7 @@ class SellerProduct extends Model 'category_id' => 'integer', 'seller_id' => 'integer', 'selected' => 'boolean', + 'golden_product_id' => 'integer', ]; public function sellerVariants(): HasMany @@ -74,4 +76,9 @@ public function seller(): BelongsTo { return $this->belongsTo(Seller::class); } + + public function goldenProduct(): BelongsTo + { + return $this->belongsTo(GoldenProduct::class); + } } diff --git a/database/factories/SellerProductFactory.php b/database/factories/SellerProductFactory.php index 3609f56..44ebec6 100644 --- a/database/factories/SellerProductFactory.php +++ b/database/factories/SellerProductFactory.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; use App\Models\Category; +use App\Models\GoldenProduct; use App\Models\Seller; use App\Models\SellerProduct; @@ -36,6 +37,7 @@ public function definition(): array 'upc' => $this->faker->word(), 'gtin_14' => $this->faker->word(), 'gtin_8' => $this->faker->word(), + 'golden_product_id' => GoldenProduct::factory(), ]; } } diff --git a/database/migrations/2024_12_03_124252_create_sellers_table.php b/database/migrations/2024_12_03_124252_create_sellers_table.php deleted file mode 100644 index b8628ef..0000000 --- a/database/migrations/2024_12_03_124252_create_sellers_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->string('name'); - $table->boolean('hideProducts')->default(false); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('sellers'); - } -}; diff --git a/database/migrations/2024_12_03_124253_create_partnerships_table.php b/database/migrations/2024_12_03_124253_create_partnerships_table.php deleted file mode 100644 index 0ee0a49..0000000 --- a/database/migrations/2024_12_03_124253_create_partnerships_table.php +++ /dev/null @@ -1,36 +0,0 @@ -id(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->enum('status', ["submitted","accepted","rejected","review"])->default('submitted'); - $table->text('rejection_reason')->nullable(); - $table->text('notes')->nullable(); - $table->boolean('select_all_products')->default(false); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('partnerships'); - } -}; diff --git a/database/migrations/2024_12_03_124254_create_seller_data_table.php b/database/migrations/2024_12_03_124254_create_seller_data_table.php deleted file mode 100644 index d87cc30..0000000 --- a/database/migrations/2024_12_03_124254_create_seller_data_table.php +++ /dev/null @@ -1,52 +0,0 @@ -id(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->string('email')->nullable(); - $table->text('description')->nullable(); - $table->string('company_name')->nullable(); - $table->string('address_line1')->nullable(); - $table->string('address_line2')->nullable(); - $table->string('city')->nullable(); - $table->string('state')->nullable(); - $table->string('postal_code')->nullable(); - $table->string('country_code')->nullable(); - $table->string('phone')->nullable(); - $table->string('vat')->nullable(); - $table->string('tin')->nullable(); - $table->string('eori')->nullable(); - $table->string('iban')->nullable(); - $table->string('swift_bic')->nullable(); - $table->string('bank_name')->nullable(); - $table->string('account_holder_name')->nullable(); - $table->string('file1')->nullable(); - $table->string('file2')->nullable(); - $table->string('file3')->nullable(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_data'); - } -}; diff --git a/database/migrations/2024_12_03_124255_create_categories_table.php b/database/migrations/2024_12_03_124255_create_categories_table.php deleted file mode 100644 index 5aacc7b..0000000 --- a/database/migrations/2024_12_03_124255_create_categories_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('name'); - $table->text('description')->nullable(); - $table->boolean('is_active')->nullable(); - $table->foreignId('parent_id')->nullable()->constrained('categories')->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('categories'); - } -}; diff --git a/database/migrations/2024_12_03_124256_create_seller_products_table.php b/database/migrations/2024_12_03_124256_create_seller_products_table.php deleted file mode 100644 index 1ddc912..0000000 --- a/database/migrations/2024_12_03_124256_create_seller_products_table.php +++ /dev/null @@ -1,44 +0,0 @@ -id(); - $table->string('name'); - $table->string('brand')->nullable(); - $table->string('sku')->nullable(); - $table->text('description')->nullable(); - $table->json('attributes')->nullable(); - $table->foreignId('category_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->enum('status', ["draft","active","delisted"])->default('draft'); - $table->boolean('selected')->default(false); - $table->string('ean')->nullable(); - $table->string('upc')->nullable(); - $table->string('gtin_14')->nullable(); - $table->string('gtin_8')->nullable(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_products'); - } -}; diff --git a/database/migrations/2024_12_03_124257_create_seller_product_images_table.php b/database/migrations/2024_12_03_124257_create_seller_product_images_table.php deleted file mode 100644 index fc04f51..0000000 --- a/database/migrations/2024_12_03_124257_create_seller_product_images_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->string('image'); - $table->integer('number')->default(1); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_product_images'); - } -}; diff --git a/database/migrations/2024_12_03_124258_create_seller_variants_table.php b/database/migrations/2024_12_03_124258_create_seller_variants_table.php deleted file mode 100644 index d33fbd7..0000000 --- a/database/migrations/2024_12_03_124258_create_seller_variants_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->string('name'); - $table->string('sku')->nullable(); - $table->text('description')->nullable(); - $table->json('attributes')->nullable(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->enum('status', ["draft","active","delisted"])->default('draft'); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_variants'); - } -}; diff --git a/database/migrations/2024_12_03_124259_create_prices_table.php b/database/migrations/2024_12_03_124259_create_prices_table.php deleted file mode 100644 index cf72b6a..0000000 --- a/database/migrations/2024_12_03_124259_create_prices_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->integer('amount'); - $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('currency_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('prices'); - } -}; diff --git a/database/migrations/2024_12_03_124300_create_stocks_table.php b/database/migrations/2024_12_03_124300_create_stocks_table.php deleted file mode 100644 index 17b09e8..0000000 --- a/database/migrations/2024_12_03_124300_create_stocks_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->integer('quantity'); - $table->integer('reserved')->nullable(); - $table->integer('safety_stock')->nullable(); - $table->foreignId('seller_variant_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('location_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('stocks'); - } -}; diff --git a/database/migrations/2024_12_03_124301_create_locations_table.php b/database/migrations/2024_12_03_124301_create_locations_table.php deleted file mode 100644 index c643177..0000000 --- a/database/migrations/2024_12_03_124301_create_locations_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('name'); - $table->string('address'); - $table->integer('default_delivery_days')->nullable(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('locations'); - } -}; diff --git a/database/migrations/2024_12_03_124302_create_currencies_table.php b/database/migrations/2024_12_03_124302_create_currencies_table.php deleted file mode 100644 index 10e1a36..0000000 --- a/database/migrations/2024_12_03_124302_create_currencies_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('code'); - $table->string('symbol'); - $table->string('name')->nullable(); - $table->boolean('is_default')->default(false); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('currencies'); - } -}; diff --git a/database/migrations/2024_12_03_124303_create_messages_table.php b/database/migrations/2024_12_03_124303_create_messages_table.php deleted file mode 100644 index b37b7ca..0000000 --- a/database/migrations/2024_12_03_124303_create_messages_table.php +++ /dev/null @@ -1,34 +0,0 @@ -id(); - $table->text('content'); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('message_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('messages'); - } -}; diff --git a/database/migrations/2024_12_03_124304_create_product_types_table.php b/database/migrations/2024_12_03_124304_create_product_types_table.php deleted file mode 100644 index fdf1c25..0000000 --- a/database/migrations/2024_12_03_124304_create_product_types_table.php +++ /dev/null @@ -1,32 +0,0 @@ -id(); - $table->string('name'); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('product_types'); - } -}; diff --git a/database/migrations/2024_12_03_124305_create_product_type_attributes_table.php b/database/migrations/2024_12_03_124305_create_product_type_attributes_table.php deleted file mode 100644 index 19c0375..0000000 --- a/database/migrations/2024_12_03_124305_create_product_type_attributes_table.php +++ /dev/null @@ -1,43 +0,0 @@ -id(); - $table->string('name'); - $table->enum('type', ["text","boolean","number","select","url","color"]); - $table->boolean('is_translatable')->default(false); - $table->enum('field', ["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]); - $table->boolean('required')->default(false); - $table->integer('rank')->default(0); - $table->string('description')->nullable(); - $table->string('unit')->nullable(); - $table->boolean('is_variant_attribute')->default(false); - $table->json('options')->nullable(); - $table->json('validators')->nullable(); - $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('product_type_attributes'); - } -}; diff --git a/database/migrations/2024_12_03_124306_create_golden_products_table.php b/database/migrations/2024_12_03_124306_create_golden_products_table.php deleted file mode 100644 index aa1610f..0000000 --- a/database/migrations/2024_12_03_124306_create_golden_products_table.php +++ /dev/null @@ -1,32 +0,0 @@ -id(); - $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('golden_products'); - } -}; diff --git a/database/migrations/2024_12_03_124307_create_golden_product_localizeds_table.php b/database/migrations/2024_12_03_124307_create_golden_product_localizeds_table.php deleted file mode 100644 index a9b0945..0000000 --- a/database/migrations/2024_12_03_124307_create_golden_product_localizeds_table.php +++ /dev/null @@ -1,37 +0,0 @@ -id(); - $table->string('name'); - $table->text('description')->nullable(); - $table->json('attributes')->nullable(); - $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('locale_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('golden_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('golden_product_localizeds'); - } -}; diff --git a/database/migrations/2024_12_03_124308_create_locales_table.php b/database/migrations/2024_12_03_124308_create_locales_table.php deleted file mode 100644 index 272da91..0000000 --- a/database/migrations/2024_12_03_124308_create_locales_table.php +++ /dev/null @@ -1,34 +0,0 @@ -id(); - $table->string('code'); - $table->string('name'); - $table->boolean('default'); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('locales'); - } -}; diff --git a/database/migrations/2024_12_03_124309_create_orders_table.php b/database/migrations/2024_12_03_124309_create_orders_table.php deleted file mode 100644 index b853df1..0000000 --- a/database/migrations/2024_12_03_124309_create_orders_table.php +++ /dev/null @@ -1,37 +0,0 @@ -id(); - $table->string('order_number'); - $table->enum('status', ["pending","processing","shipped","delivered","cancelled"])->default('pending'); - $table->integer('total_amount'); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->text('shipping_address'); - $table->text('billing_address'); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('orders'); - } -}; diff --git a/database/migrations/2024_12_03_124310_create_order_items_table.php b/database/migrations/2024_12_03_124310_create_order_items_table.php deleted file mode 100644 index 91ef70f..0000000 --- a/database/migrations/2024_12_03_124310_create_order_items_table.php +++ /dev/null @@ -1,36 +0,0 @@ -id(); - $table->foreignId('order_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->integer('quantity'); - $table->integer('price'); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('order_items'); - } -}; diff --git a/database/migrations/2024_12_03_124311_create_seller_user_table.php b/database/migrations/2024_12_03_124311_create_seller_user_table.php deleted file mode 100644 index b124774..0000000 --- a/database/migrations/2024_12_03_124311_create_seller_user_table.php +++ /dev/null @@ -1,31 +0,0 @@ -foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('user_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_user'); - } -}; diff --git a/database/migrations/2024_12_02_185412_create_sellers_table.php b/database/migrations/2024_12_04_120427_create_sellers_table.php similarity index 100% rename from database/migrations/2024_12_02_185412_create_sellers_table.php rename to database/migrations/2024_12_04_120427_create_sellers_table.php diff --git a/database/migrations/2024_12_02_185413_create_partnerships_table.php b/database/migrations/2024_12_04_120428_create_partnerships_table.php similarity index 100% rename from database/migrations/2024_12_02_185413_create_partnerships_table.php rename to database/migrations/2024_12_04_120428_create_partnerships_table.php diff --git a/database/migrations/2024_12_02_185414_create_seller_data_table.php b/database/migrations/2024_12_04_120429_create_seller_data_table.php similarity index 100% rename from database/migrations/2024_12_02_185414_create_seller_data_table.php rename to database/migrations/2024_12_04_120429_create_seller_data_table.php diff --git a/database/migrations/2024_12_02_185415_create_categories_table.php b/database/migrations/2024_12_04_120430_create_categories_table.php similarity index 100% rename from database/migrations/2024_12_02_185415_create_categories_table.php rename to database/migrations/2024_12_04_120430_create_categories_table.php diff --git a/database/migrations/2024_12_02_185416_create_seller_products_table.php b/database/migrations/2024_12_04_120431_create_seller_products_table.php similarity index 92% rename from database/migrations/2024_12_02_185416_create_seller_products_table.php rename to database/migrations/2024_12_04_120431_create_seller_products_table.php index 1ddc912..768dd76 100644 --- a/database/migrations/2024_12_02_185416_create_seller_products_table.php +++ b/database/migrations/2024_12_04_120431_create_seller_products_table.php @@ -28,6 +28,7 @@ public function up(): void $table->string('upc')->nullable(); $table->string('gtin_14')->nullable(); $table->string('gtin_8')->nullable(); + $table->foreignId('golden_product_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_02_185417_create_seller_product_images_table.php b/database/migrations/2024_12_04_120432_create_seller_product_images_table.php similarity index 100% rename from database/migrations/2024_12_02_185417_create_seller_product_images_table.php rename to database/migrations/2024_12_04_120432_create_seller_product_images_table.php diff --git a/database/migrations/2024_12_02_185418_create_seller_variants_table.php b/database/migrations/2024_12_04_120433_create_seller_variants_table.php similarity index 100% rename from database/migrations/2024_12_02_185418_create_seller_variants_table.php rename to database/migrations/2024_12_04_120433_create_seller_variants_table.php diff --git a/database/migrations/2024_12_02_185419_create_prices_table.php b/database/migrations/2024_12_04_120434_create_prices_table.php similarity index 100% rename from database/migrations/2024_12_02_185419_create_prices_table.php rename to database/migrations/2024_12_04_120434_create_prices_table.php diff --git a/database/migrations/2024_12_02_185420_create_stocks_table.php b/database/migrations/2024_12_04_120435_create_stocks_table.php similarity index 100% rename from database/migrations/2024_12_02_185420_create_stocks_table.php rename to database/migrations/2024_12_04_120435_create_stocks_table.php diff --git a/database/migrations/2024_12_02_185421_create_locations_table.php b/database/migrations/2024_12_04_120436_create_locations_table.php similarity index 100% rename from database/migrations/2024_12_02_185421_create_locations_table.php rename to database/migrations/2024_12_04_120436_create_locations_table.php diff --git a/database/migrations/2024_12_02_185422_create_currencies_table.php b/database/migrations/2024_12_04_120437_create_currencies_table.php similarity index 100% rename from database/migrations/2024_12_02_185422_create_currencies_table.php rename to database/migrations/2024_12_04_120437_create_currencies_table.php diff --git a/database/migrations/2024_12_02_185423_create_messages_table.php b/database/migrations/2024_12_04_120438_create_messages_table.php similarity index 100% rename from database/migrations/2024_12_02_185423_create_messages_table.php rename to database/migrations/2024_12_04_120438_create_messages_table.php diff --git a/database/migrations/2024_12_02_185424_create_product_types_table.php b/database/migrations/2024_12_04_120439_create_product_types_table.php similarity index 100% rename from database/migrations/2024_12_02_185424_create_product_types_table.php rename to database/migrations/2024_12_04_120439_create_product_types_table.php diff --git a/database/migrations/2024_12_02_185425_create_product_type_attributes_table.php b/database/migrations/2024_12_04_120440_create_product_type_attributes_table.php similarity index 100% rename from database/migrations/2024_12_02_185425_create_product_type_attributes_table.php rename to database/migrations/2024_12_04_120440_create_product_type_attributes_table.php diff --git a/database/migrations/2024_12_02_185426_create_golden_products_table.php b/database/migrations/2024_12_04_120441_create_golden_products_table.php similarity index 100% rename from database/migrations/2024_12_02_185426_create_golden_products_table.php rename to database/migrations/2024_12_04_120441_create_golden_products_table.php diff --git a/database/migrations/2024_12_02_185427_create_golden_product_localizeds_table.php b/database/migrations/2024_12_04_120442_create_golden_product_localizeds_table.php similarity index 100% rename from database/migrations/2024_12_02_185427_create_golden_product_localizeds_table.php rename to database/migrations/2024_12_04_120442_create_golden_product_localizeds_table.php diff --git a/database/migrations/2024_12_02_185428_create_locales_table.php b/database/migrations/2024_12_04_120443_create_locales_table.php similarity index 100% rename from database/migrations/2024_12_02_185428_create_locales_table.php rename to database/migrations/2024_12_04_120443_create_locales_table.php diff --git a/database/migrations/2024_12_02_185429_create_seller_user_table.php b/database/migrations/2024_12_04_120444_create_seller_user_table.php similarity index 100% rename from database/migrations/2024_12_02_185429_create_seller_user_table.php rename to database/migrations/2024_12_04_120444_create_seller_user_table.php diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index bfb943a..c1b15f7 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -339,8 +339,20 @@ public function run(): void ], ]; - foreach ($sellerProducts as $product) { - SellerProduct::create($product); + foreach ($sellerProducts as $productData) { + SellerProduct::create($productData); + } + + // Relate some seller products with golden products + $goldenProducts = GoldenProduct::all(); + $sellerProducts = SellerProduct::all(); + + // For each golden product, relate it with 2-3 seller products + foreach ($goldenProducts as $goldenProduct) { + $randomSellerProducts = $sellerProducts->random(rand(2, 3)); + foreach ($randomSellerProducts as $sellerProduct) { + $sellerProduct->update(['golden_product_id' => $goldenProduct->id]); + } } $sellerVariants = [ diff --git a/draft.yaml b/draft.yaml index fb16728..713a083 100644 --- a/draft.yaml +++ b/draft.yaml @@ -45,6 +45,7 @@ models: parent_id: id foreign:categories.id nullable relationships: hasMany: SellerProduct + SellerProduct: name: string brand: string nullable @@ -59,6 +60,7 @@ models: upc: string nullable gtin_14: string nullable gtin_8: string nullable + golden_product_id: id foreign nullable relationships: hasMany: SellerVariant,Price,Stock,SellerProductImage:image @@ -138,7 +140,7 @@ models: GoldenProduct: product_type_id: id foreign relationships: - hasMany: GoldenProductLocalized:translation + hasMany: GoldenProductLocalized:translation, SellerProduct GoldenProductLocalized: name: string From d94e92686a5b3bd35bde21ce84de6e580e3e2559 Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 14:47:51 +0100 Subject: [PATCH 08/19] ... --- .../Owner/Resources/GoldenProductResource.php | 4 + .../SellerProductsRelationManager.php | 75 ++++++++++++++++--- .../VariantsRelationManager.php | 1 - draft.yaml | 2 +- specs.md | 12 ++- 5 files changed, 80 insertions(+), 14 deletions(-) diff --git a/app/Filament/Owner/Resources/GoldenProductResource.php b/app/Filament/Owner/Resources/GoldenProductResource.php index dd86e1a..40e9be6 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource.php +++ b/app/Filament/Owner/Resources/GoldenProductResource.php @@ -308,6 +308,10 @@ public static function table(Table $table): Table Tables\Columns\TextColumn::make('productType.name') ->label('Product Type') ->sortable(), + Tables\Columns\TextColumn::make('seller_products_count') + ->label('Seller Products') + ->counts('sellerProducts') + ->sortable(), Tables\Columns\TextColumn::make('created_at') ->dateTime() ->sortable() diff --git a/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php b/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php index 28423f9..237f10d 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php +++ b/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php @@ -7,6 +7,9 @@ use Filament\Resources\RelationManagers\RelationManager; use Filament\Tables; use Filament\Tables\Table; +use Filament\Forms\Components\Section; +use Illuminate\Database\Eloquent\Model; +use App\Models\SellerVariant; class SellerProductsRelationManager extends RelationManager { @@ -18,16 +21,68 @@ public function form(Form $form): Form { return $form ->schema([ - Forms\Components\TextInput::make('name') - ->required() - ->maxLength(255), - Forms\Components\TextInput::make('brand') - ->maxLength(255), - Forms\Components\TextInput::make('sku') - ->maxLength(255), - Forms\Components\Textarea::make('description') - ->maxLength(65535), - Forms\Components\KeyValue::make('attributes'), + Section::make('Product Details') + ->schema([ + Forms\Components\TextInput::make('name') + ->required() + ->maxLength(255), + Forms\Components\TextInput::make('brand') + ->maxLength(255), + Forms\Components\TextInput::make('sku') + ->maxLength(255), + Forms\Components\Textarea::make('description') + ->columnSpan(2) + ->maxLength(65535), + Forms\Components\KeyValue::make('attributes')->columnSpan(2), + ]) + ->columns(2), + + Section::make('Variants') + ->schema(function ($record) { + if (!$record) { + return []; + } + + return SellerVariant::where('seller_product_id', $record->id) + ->get() + ->map( + fn($variant) => + Section::make($variant->name) + ->description("SKU: {$variant->sku}") + ->schema([ + Forms\Components\TextInput::make("variant_{$variant->id}_name") + ->label('Name') + ->disabled() + ->afterStateHydrated(function (Forms\Components\TextInput $component) use ($variant) { + $component->state($variant->name); + }), + Forms\Components\TextInput::make("variant_{$variant->id}_sku") + ->label('SKU') + ->disabled() + ->afterStateHydrated(function (Forms\Components\TextInput $component) use ($variant) { + $component->state($variant->sku); + }), + Forms\Components\Textarea::make("variant_{$variant->id}_description") + ->label('Description') + ->disabled() + ->columnSpanFull() + ->afterStateHydrated(function (Forms\Components\Textarea $component) use ($variant) { + $component->state($variant->description); + }), + Forms\Components\KeyValue::make("variant_{$variant->id}_attributes") + ->label('Attributes') + ->disabled() + ->columnSpanFull() + ->afterStateHydrated(function (Forms\Components\KeyValue $component) use ($variant) { + $component->state($variant->attributes); + }), + ]) + ->collapsible() + ->collapsed() + ->columns(2) + ) + ->toArray(); + }), ]); } diff --git a/app/Filament/Seller/Resources/SellerProductResource/RelationManagers/VariantsRelationManager.php b/app/Filament/Seller/Resources/SellerProductResource/RelationManagers/VariantsRelationManager.php index 15ac062..1876e66 100644 --- a/app/Filament/Seller/Resources/SellerProductResource/RelationManagers/VariantsRelationManager.php +++ b/app/Filament/Seller/Resources/SellerProductResource/RelationManagers/VariantsRelationManager.php @@ -71,7 +71,6 @@ public function form(Form $form): Form Forms\Components\Section::make('Variant Details') ->schema([ Forms\Components\TextInput::make('name') - ->required() ->helperText('The display name for this variant'), Forms\Components\Select::make('status') diff --git a/draft.yaml b/draft.yaml index 713a083..ef2531e 100644 --- a/draft.yaml +++ b/draft.yaml @@ -71,7 +71,7 @@ models: number: integer default:1 SellerVariant: - name: string + name: string nullable sku: string nullable description: text nullable attributes: json nullable diff --git a/specs.md b/specs.md index 5521f8c..d52fb5f 100644 --- a/specs.md +++ b/specs.md @@ -40,13 +40,21 @@ When a seller sets a seller-product to "active", then: - [ ] ... prices and stocks are copied to the golden product and marked with the seller's ID (existing entities must get the prefix Seller*) - [ ] ... images are copied to the golden product (with seller ID). AI chooses one set of products and marks it, so the shop can use it. - [ ] If there is already a golden record that is related to a seller-product then .... -- [ ] - [ ] If there is already a golden record that is not yet related to a seller-product, but has the same EAN then .... +- [ ] If there is already a golden record that is not yet related to a seller-product, but has the same EAN then .... +- [ ] TODO Variant creation # Owner - Golden Products -- [ ] As an Owner, I can see a list of all Golden Products, with badge for "new" and "updated". I can also see the number of related seller-products (from different sellers that sell the same product) +- [ ] As an Owner, I can see a list of all Golden Products. I can also see the number of related seller-products (from different sellers that sell the same product). +- [ ] As an owner, I see the selected images for each golden product +- [ ] As an owner, I see the stock levels of the golden product (accross sellers) +- [ ] As an owner, there is a status badge for "new" and "updated" +- [ ] As an owner, I can see the golden product data in all configured languages - [ ] As an owner, I can see golden product form based on the defined product types and their attributes in all configured languages, side-by-side with the seller's data. - [ ] As an owner, I can change any data of the golden record. - [ ] As an owner, I can choose which image set is used for my shop. - [ ] As an owner, I can set a status on the golden product, so it's published to my shop. - [ ] TODO status + +TODO: +- Variant - localizable flag is ignored \ No newline at end of file From e44fff12ccf59ab919c885ae247821ca2aded8da Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 15:07:24 +0100 Subject: [PATCH 09/19] ... --- .../SellerProductsRelationManager.php | 248 +++++++++++++----- 1 file changed, 189 insertions(+), 59 deletions(-) diff --git a/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php b/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php index 237f10d..7b2704f 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php +++ b/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/SellerProductsRelationManager.php @@ -10,6 +10,8 @@ use Filament\Forms\Components\Section; use Illuminate\Database\Eloquent\Model; use App\Models\SellerVariant; +use App\Models\Currency; +use App\Models\Location; class SellerProductsRelationManager extends RelationManager { @@ -20,70 +22,198 @@ class SellerProductsRelationManager extends RelationManager public function form(Form $form): Form { return $form - ->schema([ - Section::make('Product Details') - ->schema([ - Forms\Components\TextInput::make('name') - ->required() - ->maxLength(255), - Forms\Components\TextInput::make('brand') - ->maxLength(255), - Forms\Components\TextInput::make('sku') - ->maxLength(255), - Forms\Components\Textarea::make('description') - ->columnSpan(2) - ->maxLength(65535), - Forms\Components\KeyValue::make('attributes')->columnSpan(2), - ]) - ->columns(2), - - Section::make('Variants') - ->schema(function ($record) { - if (!$record) { - return []; - } - - return SellerVariant::where('seller_product_id', $record->id) - ->get() - ->map( - fn($variant) => - Section::make($variant->name) - ->description("SKU: {$variant->sku}") - ->schema([ - Forms\Components\TextInput::make("variant_{$variant->id}_name") - ->label('Name') - ->disabled() - ->afterStateHydrated(function (Forms\Components\TextInput $component) use ($variant) { - $component->state($variant->name); - }), - Forms\Components\TextInput::make("variant_{$variant->id}_sku") - ->label('SKU') - ->disabled() - ->afterStateHydrated(function (Forms\Components\TextInput $component) use ($variant) { - $component->state($variant->sku); - }), - Forms\Components\Textarea::make("variant_{$variant->id}_description") - ->label('Description') + ->schema(function ($record) { + $schema = [ + Section::make('General Product Details') + ->schema([ + Forms\Components\TextInput::make('name') + ->required() + ->maxLength(255), + Forms\Components\TextInput::make('brand') + ->maxLength(255), + Forms\Components\TextInput::make('sku') + ->maxLength(255), + Forms\Components\Textarea::make('description') + ->columnSpan(2) + ->maxLength(65535), + Forms\Components\KeyValue::make('attributes') + ->columnSpan(2) + ->reorderable() + ->editableKeys(false) + ->editableValues(false), + Section::make('Default Prices') + ->schema(function () use ($record) { + $allCurrencies = Currency::all(); + return $allCurrencies->map(function ($currency) use ($record) { + $price = $record ? $record->prices()->where('currency_id', $currency->id)->whereNull('seller_variant_id')->first() : null; + return Forms\Components\TextInput::make("price_{$currency->id}") + ->label("{$currency->code} Price") ->disabled() - ->columnSpanFull() - ->afterStateHydrated(function (Forms\Components\Textarea $component) use ($variant) { - $component->state($variant->description); - }), - Forms\Components\KeyValue::make("variant_{$variant->id}_attributes") - ->label('Attributes') + ->prefix($currency->symbol) + ->afterStateHydrated(function (Forms\Components\TextInput $component) use ($price) { + $component->state($price?->amount); + }); + })->toArray(); + }) + ->collapsible() + ->collapsed() + ->columns(3) + ->columnSpanFull(), + Section::make('Images') + ->schema([ + Forms\Components\Repeater::make('images') + ->label('Product Images') + ->relationship( + 'images', + modifyQueryUsing: fn($query) => $query->whereNull('seller_variant_id') + ) + ->disabled() + ->schema([ + Forms\Components\TextInput::make('image') + ->label('Image URL') + ->url() + ->disabled(), + ]) + ->columns(1), + ]) + ->collapsible() + ->collapsed() + ->columnSpanFull(), + ]) + ->collapsible() + ->collapsed() + ->columns(2), + ]; + + if ($record) { + $variants = SellerVariant::where('seller_product_id', $record->id)->get(); + $allCurrencies = Currency::all(); + + $schema[] = Forms\Components\Placeholder::make('variants_explanation') + ->content('Below you will find all variants of this seller product. Each variant represents a specific version or configuration of the product (e.g., different sizes, colors, or other attributes). Variants have their own pricing, stock levels, and images.') + ->extraAttributes(['class' => 'text-gray-500']) + ->columnSpanFull(); + + $variantSections = $variants->map( + fn($variant) => + Section::make($variant->name ?? "Variant {$variant->id}") + ->description("SKU: {$variant->sku}") + ->schema([ + Forms\Components\TextInput::make("variant_{$variant->id}_name") + ->label('Name') + ->helperText('The display name for this variant') + ->disabled(), + + Forms\Components\TextInput::make("variant_{$variant->id}_sku") + ->label('SKU') + ->helperText('Stock Keeping Unit - A unique identifier for this variant') + ->disabled(), + + Forms\Components\Select::make("variant_{$variant->id}_status") + ->label('Status') + ->options([ + 'draft' => 'Draft', + 'active' => 'Active', + 'delisted' => 'Delisted' + ]) + ->disabled() + ->afterStateHydrated(function (Forms\Components\Select $component) use ($variant) { + $component->state($variant->status); + }), + + Forms\Components\Textarea::make("variant_{$variant->id}_description") + ->label('Description') + ->helperText('Detailed description of this specific variant') + ->columnSpanFull() + ->disabled() + ->afterStateHydrated(function (Forms\Components\Textarea $component) use ($variant) { + $component->state($variant->description); + }), + + Forms\Components\KeyValue::make("variant_{$variant->id}_attributes") + ->label('Attributes') + ->helperText('Custom attributes for this variant (e.g. Color: Red, Size: Large)') + ->columnSpanFull() + ->reorderable() + ->disabled() + ->afterStateHydrated(function (Forms\Components\KeyValue $component) use ($variant) { + $component->state($variant->attributes); + }), + + Section::make('Pricing') + ->schema( + $allCurrencies->map(function ($currency) use ($variant) { + $price = $variant->prices()->where('currency_id', $currency->id)->first(); + return Forms\Components\TextInput::make("variant_{$variant->id}_price_{$currency->id}") + ->label("{$currency->code} Price") + ->disabled() + ->prefix($currency->symbol) + ->afterStateHydrated(function (Forms\Components\TextInput $component) use ($price) { + $component->state($price?->amount); + }); + })->toArray() + ) + ->collapsible() + ->collapsed() + ->columns(3), + + Section::make('Stock') + ->schema(function () use ($variant) { + $locations = Location::where('seller_id', $variant->seller_id)->get(); + + if ($locations->isEmpty()) { + return [ + Forms\Components\Placeholder::make('no_locations') + ->content('No warehouse locations configured') + ->extraAttributes(['class' => 'text-warning-600']) + ]; + } + + return $locations->map(function ($location) use ($variant) { + $stock = $variant->stocks()->where('location_id', $location->id)->first(); + return Forms\Components\TextInput::make("variant_{$variant->id}_stock_{$location->id}") + ->label("Stock at {$location->name}") + ->disabled() + ->afterStateHydrated(function (Forms\Components\TextInput $component) use ($stock) { + $component->state($stock?->quantity); + }); + })->toArray(); + }) + ->collapsible() + ->collapsed() + ->columns(3), + + Section::make('Images') + ->schema([ + Forms\Components\Repeater::make("variant_{$variant->id}_images") + ->label('Additional images for this variant') ->disabled() - ->columnSpanFull() - ->afterStateHydrated(function (Forms\Components\KeyValue $component) use ($variant) { - $component->state($variant->attributes); - }), + ->relationship( + 'images', + modifyQueryUsing: fn($query) => $query->where('seller_variant_id', $variant->id) + ) + ->schema([ + Forms\Components\TextInput::make('image') + ->label('Image URL') + ->url() + ->disabled(), + ]) + ->columns(1), ]) ->collapsible() ->collapsed() - ->columns(2) - ) - ->toArray(); - }), - ]); + ->columns(1), + ]) + ->collapsible() + ->collapsed() + ->columns(2) + )->toArray(); + + return array_merge($schema, $variantSections); + } + + return $schema; + }); } public function table(Table $table): Table From 71b5f7803925121ad3405c51297e940c02b097bb Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 15:14:38 +0100 Subject: [PATCH 10/19] ... --- .blueprint | 48 ++++++----- app/Models/GoldenProduct.php | 5 ++ ...2024_12_04_120427_create_sellers_table.php | 29 ------- ...12_04_120428_create_partnerships_table.php | 36 --------- ..._12_04_120429_create_seller_data_table.php | 52 ------------ ...4_12_04_120430_create_categories_table.php | 35 -------- ...04_120431_create_seller_products_table.php | 45 ----------- ...432_create_seller_product_images_table.php | 35 -------- ...04_120433_create_seller_variants_table.php | 38 --------- .../2024_12_04_120434_create_prices_table.php | 35 -------- .../2024_12_04_120435_create_stocks_table.php | 38 --------- ...24_12_04_120436_create_locations_table.php | 35 -------- ...4_12_04_120437_create_currencies_table.php | 35 -------- ...024_12_04_120438_create_messages_table.php | 34 -------- ...2_04_120439_create_product_types_table.php | 32 -------- ...0_create_product_type_attributes_table.php | 43 ---------- ...04_120441_create_golden_products_table.php | 32 -------- ...create_golden_product_localizeds_table.php | 37 --------- ...2024_12_04_120443_create_locales_table.php | 34 -------- ..._12_04_120444_create_seller_user_table.php | 31 ------- database/seeders/DatabaseSeeder.php | 81 +++++++++++++++++++ draft.yaml | 14 +++- 22 files changed, 127 insertions(+), 677 deletions(-) delete mode 100644 database/migrations/2024_12_04_120427_create_sellers_table.php delete mode 100644 database/migrations/2024_12_04_120428_create_partnerships_table.php delete mode 100644 database/migrations/2024_12_04_120429_create_seller_data_table.php delete mode 100644 database/migrations/2024_12_04_120430_create_categories_table.php delete mode 100644 database/migrations/2024_12_04_120431_create_seller_products_table.php delete mode 100644 database/migrations/2024_12_04_120432_create_seller_product_images_table.php delete mode 100644 database/migrations/2024_12_04_120433_create_seller_variants_table.php delete mode 100644 database/migrations/2024_12_04_120434_create_prices_table.php delete mode 100644 database/migrations/2024_12_04_120435_create_stocks_table.php delete mode 100644 database/migrations/2024_12_04_120436_create_locations_table.php delete mode 100644 database/migrations/2024_12_04_120437_create_currencies_table.php delete mode 100644 database/migrations/2024_12_04_120438_create_messages_table.php delete mode 100644 database/migrations/2024_12_04_120439_create_product_types_table.php delete mode 100644 database/migrations/2024_12_04_120440_create_product_type_attributes_table.php delete mode 100644 database/migrations/2024_12_04_120441_create_golden_products_table.php delete mode 100644 database/migrations/2024_12_04_120442_create_golden_product_localizeds_table.php delete mode 100644 database/migrations/2024_12_04_120443_create_locales_table.php delete mode 100644 database/migrations/2024_12_04_120444_create_seller_user_table.php diff --git a/.blueprint b/.blueprint index bd98538..7a25a93 100644 --- a/.blueprint +++ b/.blueprint @@ -15,25 +15,29 @@ created: - database/factories/ProductTypeAttributeFactory.php - database/factories/GoldenProductFactory.php - database/factories/GoldenProductLocalizedFactory.php + - database/factories/GoldenProductVariantFactory.php + - database/factories/GoldenProductVariantLocalizedFactory.php - database/factories/LocaleFactory.php - - database/migrations/2024_12_04_120427_create_sellers_table.php - - database/migrations/2024_12_04_120428_create_partnerships_table.php - - database/migrations/2024_12_04_120429_create_seller_data_table.php - - database/migrations/2024_12_04_120430_create_categories_table.php - - database/migrations/2024_12_04_120431_create_seller_products_table.php - - database/migrations/2024_12_04_120432_create_seller_product_images_table.php - - database/migrations/2024_12_04_120433_create_seller_variants_table.php - - database/migrations/2024_12_04_120434_create_prices_table.php - - database/migrations/2024_12_04_120435_create_stocks_table.php - - database/migrations/2024_12_04_120436_create_locations_table.php - - database/migrations/2024_12_04_120437_create_currencies_table.php - - database/migrations/2024_12_04_120438_create_messages_table.php - - database/migrations/2024_12_04_120439_create_product_types_table.php - - database/migrations/2024_12_04_120440_create_product_type_attributes_table.php - - database/migrations/2024_12_04_120441_create_golden_products_table.php - - database/migrations/2024_12_04_120442_create_golden_product_localizeds_table.php - - database/migrations/2024_12_04_120443_create_locales_table.php - - database/migrations/2024_12_04_120444_create_seller_user_table.php + - database/migrations/2024_12_04_141349_create_sellers_table.php + - database/migrations/2024_12_04_141350_create_partnerships_table.php + - database/migrations/2024_12_04_141351_create_seller_data_table.php + - database/migrations/2024_12_04_141352_create_categories_table.php + - database/migrations/2024_12_04_141353_create_seller_products_table.php + - database/migrations/2024_12_04_141354_create_seller_product_images_table.php + - database/migrations/2024_12_04_141355_create_seller_variants_table.php + - database/migrations/2024_12_04_141356_create_prices_table.php + - database/migrations/2024_12_04_141357_create_stocks_table.php + - database/migrations/2024_12_04_141358_create_locations_table.php + - database/migrations/2024_12_04_141359_create_currencies_table.php + - database/migrations/2024_12_04_141400_create_messages_table.php + - database/migrations/2024_12_04_141401_create_product_types_table.php + - database/migrations/2024_12_04_141402_create_product_type_attributes_table.php + - database/migrations/2024_12_04_141403_create_golden_products_table.php + - database/migrations/2024_12_04_141404_create_golden_product_localizeds_table.php + - database/migrations/2024_12_04_141405_create_golden_product_variants_table.php + - database/migrations/2024_12_04_141406_create_golden_product_variant_localizeds_table.php + - database/migrations/2024_12_04_141407_create_locales_table.php + - database/migrations/2024_12_04_141408_create_seller_user_table.php - app/Models/Seller.php - app/Models/Partnership.php - app/Models/SellerData.php @@ -50,6 +54,8 @@ created: - app/Models/ProductTypeAttribute.php - app/Models/GoldenProduct.php - app/Models/GoldenProductLocalized.php + - app/Models/GoldenProductVariant.php + - app/Models/GoldenProductVariantLocalized.php - app/Models/Locale.php models: Customer: { } @@ -62,7 +68,7 @@ models: Category: { name: string, description: 'text nullable', is_active: 'boolean nullable', parent_id: 'id foreign:categories.id nullable', relationships: { hasMany: SellerProduct } } SellerProduct: { name: string, brand: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', category_id: 'id foreign nullable', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', selected: 'boolean default:false', ean: 'string nullable', upc: 'string nullable', gtin_14: 'string nullable', gtin_8: 'string nullable', golden_product_id: 'id foreign nullable', relationships: { hasMany: 'SellerVariant,Price,Stock,SellerProductImage:image' } } SellerProductImage: { seller_product_id: 'id foreign', seller_variant_id: 'id foreign nullable', image: string, number: 'integer default:1' } - SellerVariant: { name: string, sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', seller_product_id: 'id foreign', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', relationships: { hasMany: 'Price, Stock, SellerProductImage:image' } } + SellerVariant: { name: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', seller_product_id: 'id foreign', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', relationships: { hasMany: 'Price, Stock, SellerProductImage:image' } } Price: { amount: integer, seller_variant_id: 'id foreign nullable', seller_product_id: 'id foreign', currency_id: 'id foreign' } Stock: { quantity: integer, reserved: 'integer nullable', safety_stock: 'integer nullable', seller_variant_id: 'id foreign', seller_product_id: 'id foreign', location_id: 'id foreign', seller_id: 'id foreign' } Location: { name: string, address: string, default_delivery_days: 'integer nullable', seller_id: 'id foreign', relationships: { hasMany: Stock } } @@ -70,6 +76,8 @@ models: Message: { content: text, seller_id: 'id foreign', message_id: 'id foreign nullable' } ProductType: { name: string, relationships: { hasMany: 'ProductTypeAttribute:attribute, GoldenProduct:product' } } ProductTypeAttribute: { name: string, type: 'enum:text,boolean,number,select,url,color', is_translatable: 'boolean default:false', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', options: 'json nullable', validators: 'json nullable', product_type_id: 'id foreign' } - GoldenProduct: { product_type_id: 'id foreign', relationships: { hasMany: 'GoldenProductLocalized:translation, SellerProduct' } } + GoldenProduct: { product_type_id: 'id foreign', relationships: { hasMany: 'GoldenProductLocalized:translation, SellerProduct, GoldenProductVariant:variant' } } GoldenProductLocalized: { name: string, description: 'text nullable', attributes: 'json nullable', product_type_id: 'id foreign', locale_id: 'id foreign', golden_product_id: 'id foreign' } + GoldenProductVariant: { golden_product_id: 'id foreign', relationships: { hasMany: 'GoldenProductVariantLocalized:translation' } } + GoldenProductVariantLocalized: { name: 'string nullable', description: 'text nullable', attributes: 'json nullable', golden_product_variant_id: 'id foreign', locale_id: 'id foreign' } Locale: { code: string, name: string, default: boolean } diff --git a/app/Models/GoldenProduct.php b/app/Models/GoldenProduct.php index 1d904d0..4858116 100644 --- a/app/Models/GoldenProduct.php +++ b/app/Models/GoldenProduct.php @@ -40,6 +40,11 @@ public function sellerProducts(): HasMany return $this->hasMany(SellerProduct::class); } + public function variants(): HasMany + { + return $this->hasMany(GoldenProductVariant::class); + } + public function productType(): BelongsTo { return $this->belongsTo(ProductType::class); diff --git a/database/migrations/2024_12_04_120427_create_sellers_table.php b/database/migrations/2024_12_04_120427_create_sellers_table.php deleted file mode 100644 index b8628ef..0000000 --- a/database/migrations/2024_12_04_120427_create_sellers_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->string('name'); - $table->boolean('hideProducts')->default(false); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('sellers'); - } -}; diff --git a/database/migrations/2024_12_04_120428_create_partnerships_table.php b/database/migrations/2024_12_04_120428_create_partnerships_table.php deleted file mode 100644 index 0ee0a49..0000000 --- a/database/migrations/2024_12_04_120428_create_partnerships_table.php +++ /dev/null @@ -1,36 +0,0 @@ -id(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->enum('status', ["submitted","accepted","rejected","review"])->default('submitted'); - $table->text('rejection_reason')->nullable(); - $table->text('notes')->nullable(); - $table->boolean('select_all_products')->default(false); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('partnerships'); - } -}; diff --git a/database/migrations/2024_12_04_120429_create_seller_data_table.php b/database/migrations/2024_12_04_120429_create_seller_data_table.php deleted file mode 100644 index d87cc30..0000000 --- a/database/migrations/2024_12_04_120429_create_seller_data_table.php +++ /dev/null @@ -1,52 +0,0 @@ -id(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->string('email')->nullable(); - $table->text('description')->nullable(); - $table->string('company_name')->nullable(); - $table->string('address_line1')->nullable(); - $table->string('address_line2')->nullable(); - $table->string('city')->nullable(); - $table->string('state')->nullable(); - $table->string('postal_code')->nullable(); - $table->string('country_code')->nullable(); - $table->string('phone')->nullable(); - $table->string('vat')->nullable(); - $table->string('tin')->nullable(); - $table->string('eori')->nullable(); - $table->string('iban')->nullable(); - $table->string('swift_bic')->nullable(); - $table->string('bank_name')->nullable(); - $table->string('account_holder_name')->nullable(); - $table->string('file1')->nullable(); - $table->string('file2')->nullable(); - $table->string('file3')->nullable(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_data'); - } -}; diff --git a/database/migrations/2024_12_04_120430_create_categories_table.php b/database/migrations/2024_12_04_120430_create_categories_table.php deleted file mode 100644 index 5aacc7b..0000000 --- a/database/migrations/2024_12_04_120430_create_categories_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('name'); - $table->text('description')->nullable(); - $table->boolean('is_active')->nullable(); - $table->foreignId('parent_id')->nullable()->constrained('categories')->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('categories'); - } -}; diff --git a/database/migrations/2024_12_04_120431_create_seller_products_table.php b/database/migrations/2024_12_04_120431_create_seller_products_table.php deleted file mode 100644 index 768dd76..0000000 --- a/database/migrations/2024_12_04_120431_create_seller_products_table.php +++ /dev/null @@ -1,45 +0,0 @@ -id(); - $table->string('name'); - $table->string('brand')->nullable(); - $table->string('sku')->nullable(); - $table->text('description')->nullable(); - $table->json('attributes')->nullable(); - $table->foreignId('category_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->enum('status', ["draft","active","delisted"])->default('draft'); - $table->boolean('selected')->default(false); - $table->string('ean')->nullable(); - $table->string('upc')->nullable(); - $table->string('gtin_14')->nullable(); - $table->string('gtin_8')->nullable(); - $table->foreignId('golden_product_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_products'); - } -}; diff --git a/database/migrations/2024_12_04_120432_create_seller_product_images_table.php b/database/migrations/2024_12_04_120432_create_seller_product_images_table.php deleted file mode 100644 index fc04f51..0000000 --- a/database/migrations/2024_12_04_120432_create_seller_product_images_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->string('image'); - $table->integer('number')->default(1); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_product_images'); - } -}; diff --git a/database/migrations/2024_12_04_120433_create_seller_variants_table.php b/database/migrations/2024_12_04_120433_create_seller_variants_table.php deleted file mode 100644 index d33fbd7..0000000 --- a/database/migrations/2024_12_04_120433_create_seller_variants_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->string('name'); - $table->string('sku')->nullable(); - $table->text('description')->nullable(); - $table->json('attributes')->nullable(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->enum('status', ["draft","active","delisted"])->default('draft'); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_variants'); - } -}; diff --git a/database/migrations/2024_12_04_120434_create_prices_table.php b/database/migrations/2024_12_04_120434_create_prices_table.php deleted file mode 100644 index cf72b6a..0000000 --- a/database/migrations/2024_12_04_120434_create_prices_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->integer('amount'); - $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('currency_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('prices'); - } -}; diff --git a/database/migrations/2024_12_04_120435_create_stocks_table.php b/database/migrations/2024_12_04_120435_create_stocks_table.php deleted file mode 100644 index 17b09e8..0000000 --- a/database/migrations/2024_12_04_120435_create_stocks_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->integer('quantity'); - $table->integer('reserved')->nullable(); - $table->integer('safety_stock')->nullable(); - $table->foreignId('seller_variant_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('location_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('stocks'); - } -}; diff --git a/database/migrations/2024_12_04_120436_create_locations_table.php b/database/migrations/2024_12_04_120436_create_locations_table.php deleted file mode 100644 index c643177..0000000 --- a/database/migrations/2024_12_04_120436_create_locations_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('name'); - $table->string('address'); - $table->integer('default_delivery_days')->nullable(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('locations'); - } -}; diff --git a/database/migrations/2024_12_04_120437_create_currencies_table.php b/database/migrations/2024_12_04_120437_create_currencies_table.php deleted file mode 100644 index 10e1a36..0000000 --- a/database/migrations/2024_12_04_120437_create_currencies_table.php +++ /dev/null @@ -1,35 +0,0 @@ -id(); - $table->string('code'); - $table->string('symbol'); - $table->string('name')->nullable(); - $table->boolean('is_default')->default(false); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('currencies'); - } -}; diff --git a/database/migrations/2024_12_04_120438_create_messages_table.php b/database/migrations/2024_12_04_120438_create_messages_table.php deleted file mode 100644 index b37b7ca..0000000 --- a/database/migrations/2024_12_04_120438_create_messages_table.php +++ /dev/null @@ -1,34 +0,0 @@ -id(); - $table->text('content'); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('message_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('messages'); - } -}; diff --git a/database/migrations/2024_12_04_120439_create_product_types_table.php b/database/migrations/2024_12_04_120439_create_product_types_table.php deleted file mode 100644 index fdf1c25..0000000 --- a/database/migrations/2024_12_04_120439_create_product_types_table.php +++ /dev/null @@ -1,32 +0,0 @@ -id(); - $table->string('name'); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('product_types'); - } -}; diff --git a/database/migrations/2024_12_04_120440_create_product_type_attributes_table.php b/database/migrations/2024_12_04_120440_create_product_type_attributes_table.php deleted file mode 100644 index 19c0375..0000000 --- a/database/migrations/2024_12_04_120440_create_product_type_attributes_table.php +++ /dev/null @@ -1,43 +0,0 @@ -id(); - $table->string('name'); - $table->enum('type', ["text","boolean","number","select","url","color"]); - $table->boolean('is_translatable')->default(false); - $table->enum('field', ["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]); - $table->boolean('required')->default(false); - $table->integer('rank')->default(0); - $table->string('description')->nullable(); - $table->string('unit')->nullable(); - $table->boolean('is_variant_attribute')->default(false); - $table->json('options')->nullable(); - $table->json('validators')->nullable(); - $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('product_type_attributes'); - } -}; diff --git a/database/migrations/2024_12_04_120441_create_golden_products_table.php b/database/migrations/2024_12_04_120441_create_golden_products_table.php deleted file mode 100644 index aa1610f..0000000 --- a/database/migrations/2024_12_04_120441_create_golden_products_table.php +++ /dev/null @@ -1,32 +0,0 @@ -id(); - $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('golden_products'); - } -}; diff --git a/database/migrations/2024_12_04_120442_create_golden_product_localizeds_table.php b/database/migrations/2024_12_04_120442_create_golden_product_localizeds_table.php deleted file mode 100644 index a9b0945..0000000 --- a/database/migrations/2024_12_04_120442_create_golden_product_localizeds_table.php +++ /dev/null @@ -1,37 +0,0 @@ -id(); - $table->string('name'); - $table->text('description')->nullable(); - $table->json('attributes')->nullable(); - $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('locale_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('golden_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('golden_product_localizeds'); - } -}; diff --git a/database/migrations/2024_12_04_120443_create_locales_table.php b/database/migrations/2024_12_04_120443_create_locales_table.php deleted file mode 100644 index 272da91..0000000 --- a/database/migrations/2024_12_04_120443_create_locales_table.php +++ /dev/null @@ -1,34 +0,0 @@ -id(); - $table->string('code'); - $table->string('name'); - $table->boolean('default'); - $table->timestamps(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('locales'); - } -}; diff --git a/database/migrations/2024_12_04_120444_create_seller_user_table.php b/database/migrations/2024_12_04_120444_create_seller_user_table.php deleted file mode 100644 index b124774..0000000 --- a/database/migrations/2024_12_04_120444_create_seller_user_table.php +++ /dev/null @@ -1,31 +0,0 @@ -foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('user_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - }); - - Schema::enableForeignKeyConstraints(); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('seller_user'); - } -}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index c1b15f7..f7859c3 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -1179,6 +1179,87 @@ public function run(): void $translationData['product_type_id'] = $productData['product_type_id']; $goldenProduct->translations()->create($translationData); } + + // Create variants for each golden product + $variantData = [ + [ + 'translations' => [ + [ + 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, + 'name' => 'Large Size', + 'description' => 'Large size variant of the product', + 'attributes' => [ + 'Size' => 'large', + 'Material' => 'premium', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, + 'name' => 'Grande Taille', + 'description' => 'Variante de grande taille du produit', + 'attributes' => [ + 'Size' => 'large', + 'Material' => 'premium', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, + 'name' => 'Große Größe', + 'description' => 'Große Variante des Produkts', + 'attributes' => [ + 'Size' => 'large', + 'Material' => 'premium', + ], + ], + ], + ], + [ + 'translations' => [ + [ + 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, + 'name' => 'Medium Size', + 'description' => 'Medium size variant of the product', + 'attributes' => [ + 'Size' => 'medium', + 'Material' => 'standard', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, + 'name' => 'Taille Moyenne', + 'description' => 'Variante de taille moyenne du produit', + 'attributes' => [ + 'Size' => 'medium', + 'Material' => 'standard', + ], + ], + [ + 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, + 'name' => 'Mittlere Größe', + 'description' => 'Mittlere Variante des Produkts', + 'attributes' => [ + 'Size' => 'medium', + 'Material' => 'standard', + ], + ], + ], + ], + ]; + + // Create variants for this golden product + foreach ($variantData as $variant) { + $translations = $variant['translations']; + + // Create the variant + $goldenProductVariant = $goldenProduct->variants()->create([ + 'golden_product_id' => $goldenProduct->id, + ]); + + // Create translations for the variant + foreach ($translations as $translationData) { + $goldenProductVariant->translations()->create($translationData); + } + } } } } diff --git a/draft.yaml b/draft.yaml index ef2531e..af2369c 100644 --- a/draft.yaml +++ b/draft.yaml @@ -140,7 +140,7 @@ models: GoldenProduct: product_type_id: id foreign relationships: - hasMany: GoldenProductLocalized:translation, SellerProduct + hasMany: GoldenProductLocalized:translation, SellerProduct, GoldenProductVariant:variant GoldenProductLocalized: name: string @@ -150,6 +150,18 @@ models: locale_id: id foreign golden_product_id: id foreign + GoldenProductVariant: + golden_product_id: id foreign + relationships: + hasMany: GoldenProductVariantLocalized:translation + + GoldenProductVariantLocalized: + name: string nullable + description: text nullable + attributes: json nullable + golden_product_variant_id: id foreign + locale_id: id foreign + Locale: code: string name: string From e55655e7d6886303b826a00d388589d62e83c73a Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 15:49:27 +0100 Subject: [PATCH 11/19] ... --- .../Owner/Resources/GoldenProductResource.php | 2 + .../VariantsRelationManager.php | 210 ++++++++++++++++++ app/Models/GoldenProductVariant.php | 42 ++++ app/Models/GoldenProductVariantLocalized.php | 47 ++++ .../factories/GoldenProductVariantFactory.php | 28 +++ .../GoldenProductVariantLocalizedFactory.php | 33 +++ ...2024_12_04_141349_create_sellers_table.php | 29 +++ ...12_04_141350_create_partnerships_table.php | 36 +++ ..._12_04_141351_create_seller_data_table.php | 52 +++++ ...4_12_04_141352_create_categories_table.php | 35 +++ ...04_141353_create_seller_products_table.php | 45 ++++ ...354_create_seller_product_images_table.php | 35 +++ ...04_141355_create_seller_variants_table.php | 38 ++++ .../2024_12_04_141356_create_prices_table.php | 35 +++ .../2024_12_04_141357_create_stocks_table.php | 38 ++++ ...24_12_04_141358_create_locations_table.php | 35 +++ ...4_12_04_141359_create_currencies_table.php | 35 +++ ...024_12_04_141400_create_messages_table.php | 34 +++ ...2_04_141401_create_product_types_table.php | 32 +++ ...2_create_product_type_attributes_table.php | 43 ++++ ...04_141403_create_golden_products_table.php | 32 +++ ...create_golden_product_localizeds_table.php | 37 +++ ...5_create_golden_product_variants_table.php | 32 +++ ...olden_product_variant_localizeds_table.php | 36 +++ ...2024_12_04_141407_create_locales_table.php | 34 +++ ..._12_04_141408_create_seller_user_table.php | 31 +++ 26 files changed, 1086 insertions(+) create mode 100644 app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/VariantsRelationManager.php create mode 100644 app/Models/GoldenProductVariant.php create mode 100644 app/Models/GoldenProductVariantLocalized.php create mode 100644 database/factories/GoldenProductVariantFactory.php create mode 100644 database/factories/GoldenProductVariantLocalizedFactory.php create mode 100644 database/migrations/2024_12_04_141349_create_sellers_table.php create mode 100644 database/migrations/2024_12_04_141350_create_partnerships_table.php create mode 100644 database/migrations/2024_12_04_141351_create_seller_data_table.php create mode 100644 database/migrations/2024_12_04_141352_create_categories_table.php create mode 100644 database/migrations/2024_12_04_141353_create_seller_products_table.php create mode 100644 database/migrations/2024_12_04_141354_create_seller_product_images_table.php create mode 100644 database/migrations/2024_12_04_141355_create_seller_variants_table.php create mode 100644 database/migrations/2024_12_04_141356_create_prices_table.php create mode 100644 database/migrations/2024_12_04_141357_create_stocks_table.php create mode 100644 database/migrations/2024_12_04_141358_create_locations_table.php create mode 100644 database/migrations/2024_12_04_141359_create_currencies_table.php create mode 100644 database/migrations/2024_12_04_141400_create_messages_table.php create mode 100644 database/migrations/2024_12_04_141401_create_product_types_table.php create mode 100644 database/migrations/2024_12_04_141402_create_product_type_attributes_table.php create mode 100644 database/migrations/2024_12_04_141403_create_golden_products_table.php create mode 100644 database/migrations/2024_12_04_141404_create_golden_product_localizeds_table.php create mode 100644 database/migrations/2024_12_04_141405_create_golden_product_variants_table.php create mode 100644 database/migrations/2024_12_04_141406_create_golden_product_variant_localizeds_table.php create mode 100644 database/migrations/2024_12_04_141407_create_locales_table.php create mode 100644 database/migrations/2024_12_04_141408_create_seller_user_table.php diff --git a/app/Filament/Owner/Resources/GoldenProductResource.php b/app/Filament/Owner/Resources/GoldenProductResource.php index 40e9be6..58d59b0 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource.php +++ b/app/Filament/Owner/Resources/GoldenProductResource.php @@ -21,6 +21,7 @@ use Illuminate\Support\Collection; use App\Models\Locale; use App\Filament\Owner\Resources\GoldenProductResource\RelationManagers\SellerProductsRelationManager; +use App\Filament\Owner\Resources\GoldenProductResource\RelationManagers\VariantsRelationManager; class GoldenProductResource extends Resource { @@ -337,6 +338,7 @@ public static function table(Table $table): Table public static function getRelations(): array { return [ + VariantsRelationManager::class, SellerProductsRelationManager::class, ]; } diff --git a/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/VariantsRelationManager.php b/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/VariantsRelationManager.php new file mode 100644 index 0000000..70a6aa3 --- /dev/null +++ b/app/Filament/Owner/Resources/GoldenProductResource/RelationManagers/VariantsRelationManager.php @@ -0,0 +1,210 @@ +schema([ + Forms\Components\Select::make('active_locale') + ->label('') + ->options(function () { + return Locale::query() + ->orderBy('default', 'desc') + ->orderBy('name') + ->pluck('name', 'id'); + }) + ->default(function () { + return Locale::where('default', true)->first()?->id; + }) + ->live() + ->afterStateUpdated(function ($state, Set $set, Get $get) { + $locale = Locale::find($state); + if (!$locale) return; + + $record = $this->getOwnerRecord()->variants()->find($get('id')); + if (!$record) return; + + $translation = $record->translations() + ->where('locale_id', $locale->id) + ->first(); + + if ($translation) { + $set('name', $translation->name); + $set('description', $translation->description); + $set('attributes', $translation->attributes ?? []); + } else { + $set('name', ''); + $set('description', ''); + $set('attributes', []); + } + }) + ->selectablePlaceholder(false) + ->extraAttributes([ + 'class' => 'ml-auto w-[200px]' + ]), + + Forms\Components\Section::make('Variant Details') + ->schema([ + Forms\Components\TextInput::make('name') + ->required() + ->afterStateHydrated(function ($component, $state, $record) { + if (!$state && $record) { + $defaultLocale = Locale::where('default', true)->first(); + if (!$defaultLocale) return; + + $translation = $record->translations() + ->where('locale_id', $defaultLocale->id) + ->first(); + + $component->state($translation?->name); + } + }), + + Forms\Components\Textarea::make('description') + ->columnSpanFull() + ->afterStateHydrated(function ($component, $state, $record) { + if (!$state && $record) { + $defaultLocale = Locale::where('default', true)->first(); + if (!$defaultLocale) return; + + $translation = $record->translations() + ->where('locale_id', $defaultLocale->id) + ->first(); + + $component->state($translation?->description); + } + }), + + Forms\Components\KeyValue::make('attributes') + ->columnSpanFull() + ->helperText('Custom attributes for this variant (e.g. Color: Red, Size: Large)') + ->keyLabel('Key') + ->valueLabel('Value') + ->reorderable() + ->editableKeys() + ->editableValues() + ->afterStateHydrated(function ($component, $state, $record) { + if (!$state && $record) { + $defaultLocale = Locale::where('default', true)->first(); + if (!$defaultLocale) return; + + $translation = $record->translations() + ->where('locale_id', $defaultLocale->id) + ->first(); + + $component->state($translation?->attributes ?? []); + } + }), + ]), + ]); + } + + public function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('name') + ->getStateUsing(function (Model $record): string { + $defaultLocale = Locale::where('default', true)->first(); + if (!$defaultLocale) return ''; + + return $record->translations() + ->where('locale_id', $defaultLocale->id) + ->first()?->name ?? ''; + }) + ->searchable(query: function (Builder $query, string $search): Builder { + return $query->whereHas('translations', function ($query) use ($search) { + $query->where('name', 'like', "%{$search}%"); + }); + }), + + Tables\Columns\TextColumn::make('attributes') + ->getStateUsing(function (Model $record): string { + $defaultLocale = Locale::where('default', true)->first(); + if (!$defaultLocale) return ''; + + $attributes = $record->translations() + ->where('locale_id', $defaultLocale->id) + ->first()?->attributes ?? []; + + return collect($attributes) + ->map(fn($value, $key) => "{$key}: {$value}") + ->join(', '); + }), + ]) + ->filters([ + // + ]) + ->headerActions([ + Tables\Actions\CreateAction::make() + ->using(function (array $data, string $model): Model { + $variant = new $model(); + $variant->golden_product_id = $this->getOwnerRecord()->id; + $variant->save(); + + $activeLocale = Locale::find($data['active_locale']); + if ($activeLocale) { + $variant->translations()->create([ + 'name' => $data['name'], + 'description' => $data['description'], + 'attributes' => $data['attributes'] ?? [], + 'locale_id' => $activeLocale->id, + ]); + } + + return $variant; + }), + ]) + ->actions([ + Tables\Actions\EditAction::make() + ->using(function (Model $record, array $data): Model { + $activeLocale = Locale::find($data['active_locale']); + if ($activeLocale) { + $translation = $record->translations() + ->where('locale_id', $activeLocale->id) + ->first(); + + if ($translation) { + $translation->update([ + 'name' => $data['name'], + 'description' => $data['description'], + 'attributes' => $data['attributes'] ?? [], + ]); + } else { + $record->translations()->create([ + 'name' => $data['name'], + 'description' => $data['description'], + 'attributes' => $data['attributes'] ?? [], + 'locale_id' => $activeLocale->id, + ]); + } + } + + return $record; + }), + Tables\Actions\DeleteAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Models/GoldenProductVariant.php b/app/Models/GoldenProductVariant.php new file mode 100644 index 0000000..248086a --- /dev/null +++ b/app/Models/GoldenProductVariant.php @@ -0,0 +1,42 @@ + 'integer', + 'golden_product_id' => 'integer', + ]; + + public function translations(): HasMany + { + return $this->hasMany(GoldenProductVariantLocalized::class); + } + + public function goldenProduct(): BelongsTo + { + return $this->belongsTo(GoldenProduct::class); + } +} diff --git a/app/Models/GoldenProductVariantLocalized.php b/app/Models/GoldenProductVariantLocalized.php new file mode 100644 index 0000000..3a93e0b --- /dev/null +++ b/app/Models/GoldenProductVariantLocalized.php @@ -0,0 +1,47 @@ + 'integer', + 'attributes' => 'array', + 'golden_product_variant_id' => 'integer', + 'locale_id' => 'integer', + ]; + + public function goldenProductVariant(): BelongsTo + { + return $this->belongsTo(GoldenProductVariant::class); + } + + public function locale(): BelongsTo + { + return $this->belongsTo(Locale::class); + } +} diff --git a/database/factories/GoldenProductVariantFactory.php b/database/factories/GoldenProductVariantFactory.php new file mode 100644 index 0000000..36225d6 --- /dev/null +++ b/database/factories/GoldenProductVariantFactory.php @@ -0,0 +1,28 @@ + GoldenProduct::factory(), + ]; + } +} diff --git a/database/factories/GoldenProductVariantLocalizedFactory.php b/database/factories/GoldenProductVariantLocalizedFactory.php new file mode 100644 index 0000000..b978d29 --- /dev/null +++ b/database/factories/GoldenProductVariantLocalizedFactory.php @@ -0,0 +1,33 @@ + $this->faker->name(), + 'description' => $this->faker->text(), + 'attributes' => '{}', + 'golden_product_variant_id' => GoldenProductVariant::factory(), + 'locale_id' => Locale::factory(), + ]; + } +} diff --git a/database/migrations/2024_12_04_141349_create_sellers_table.php b/database/migrations/2024_12_04_141349_create_sellers_table.php new file mode 100644 index 0000000..b8628ef --- /dev/null +++ b/database/migrations/2024_12_04_141349_create_sellers_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('name'); + $table->boolean('hideProducts')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('sellers'); + } +}; diff --git a/database/migrations/2024_12_04_141350_create_partnerships_table.php b/database/migrations/2024_12_04_141350_create_partnerships_table.php new file mode 100644 index 0000000..0ee0a49 --- /dev/null +++ b/database/migrations/2024_12_04_141350_create_partnerships_table.php @@ -0,0 +1,36 @@ +id(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->enum('status', ["submitted","accepted","rejected","review"])->default('submitted'); + $table->text('rejection_reason')->nullable(); + $table->text('notes')->nullable(); + $table->boolean('select_all_products')->default(false); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('partnerships'); + } +}; diff --git a/database/migrations/2024_12_04_141351_create_seller_data_table.php b/database/migrations/2024_12_04_141351_create_seller_data_table.php new file mode 100644 index 0000000..d87cc30 --- /dev/null +++ b/database/migrations/2024_12_04_141351_create_seller_data_table.php @@ -0,0 +1,52 @@ +id(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->string('email')->nullable(); + $table->text('description')->nullable(); + $table->string('company_name')->nullable(); + $table->string('address_line1')->nullable(); + $table->string('address_line2')->nullable(); + $table->string('city')->nullable(); + $table->string('state')->nullable(); + $table->string('postal_code')->nullable(); + $table->string('country_code')->nullable(); + $table->string('phone')->nullable(); + $table->string('vat')->nullable(); + $table->string('tin')->nullable(); + $table->string('eori')->nullable(); + $table->string('iban')->nullable(); + $table->string('swift_bic')->nullable(); + $table->string('bank_name')->nullable(); + $table->string('account_holder_name')->nullable(); + $table->string('file1')->nullable(); + $table->string('file2')->nullable(); + $table->string('file3')->nullable(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_data'); + } +}; diff --git a/database/migrations/2024_12_04_141352_create_categories_table.php b/database/migrations/2024_12_04_141352_create_categories_table.php new file mode 100644 index 0000000..5aacc7b --- /dev/null +++ b/database/migrations/2024_12_04_141352_create_categories_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('name'); + $table->text('description')->nullable(); + $table->boolean('is_active')->nullable(); + $table->foreignId('parent_id')->nullable()->constrained('categories')->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('categories'); + } +}; diff --git a/database/migrations/2024_12_04_141353_create_seller_products_table.php b/database/migrations/2024_12_04_141353_create_seller_products_table.php new file mode 100644 index 0000000..768dd76 --- /dev/null +++ b/database/migrations/2024_12_04_141353_create_seller_products_table.php @@ -0,0 +1,45 @@ +id(); + $table->string('name'); + $table->string('brand')->nullable(); + $table->string('sku')->nullable(); + $table->text('description')->nullable(); + $table->json('attributes')->nullable(); + $table->foreignId('category_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->enum('status', ["draft","active","delisted"])->default('draft'); + $table->boolean('selected')->default(false); + $table->string('ean')->nullable(); + $table->string('upc')->nullable(); + $table->string('gtin_14')->nullable(); + $table->string('gtin_8')->nullable(); + $table->foreignId('golden_product_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_products'); + } +}; diff --git a/database/migrations/2024_12_04_141354_create_seller_product_images_table.php b/database/migrations/2024_12_04_141354_create_seller_product_images_table.php new file mode 100644 index 0000000..fc04f51 --- /dev/null +++ b/database/migrations/2024_12_04_141354_create_seller_product_images_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->string('image'); + $table->integer('number')->default(1); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_product_images'); + } +}; diff --git a/database/migrations/2024_12_04_141355_create_seller_variants_table.php b/database/migrations/2024_12_04_141355_create_seller_variants_table.php new file mode 100644 index 0000000..aa8f820 --- /dev/null +++ b/database/migrations/2024_12_04_141355_create_seller_variants_table.php @@ -0,0 +1,38 @@ +id(); + $table->string('name')->nullable(); + $table->string('sku')->nullable(); + $table->text('description')->nullable(); + $table->json('attributes')->nullable(); + $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->enum('status', ["draft","active","delisted"])->default('draft'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_variants'); + } +}; diff --git a/database/migrations/2024_12_04_141356_create_prices_table.php b/database/migrations/2024_12_04_141356_create_prices_table.php new file mode 100644 index 0000000..cf72b6a --- /dev/null +++ b/database/migrations/2024_12_04_141356_create_prices_table.php @@ -0,0 +1,35 @@ +id(); + $table->integer('amount'); + $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('currency_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('prices'); + } +}; diff --git a/database/migrations/2024_12_04_141357_create_stocks_table.php b/database/migrations/2024_12_04_141357_create_stocks_table.php new file mode 100644 index 0000000..17b09e8 --- /dev/null +++ b/database/migrations/2024_12_04_141357_create_stocks_table.php @@ -0,0 +1,38 @@ +id(); + $table->integer('quantity'); + $table->integer('reserved')->nullable(); + $table->integer('safety_stock')->nullable(); + $table->foreignId('seller_variant_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('location_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('stocks'); + } +}; diff --git a/database/migrations/2024_12_04_141358_create_locations_table.php b/database/migrations/2024_12_04_141358_create_locations_table.php new file mode 100644 index 0000000..c643177 --- /dev/null +++ b/database/migrations/2024_12_04_141358_create_locations_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('name'); + $table->string('address'); + $table->integer('default_delivery_days')->nullable(); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('locations'); + } +}; diff --git a/database/migrations/2024_12_04_141359_create_currencies_table.php b/database/migrations/2024_12_04_141359_create_currencies_table.php new file mode 100644 index 0000000..10e1a36 --- /dev/null +++ b/database/migrations/2024_12_04_141359_create_currencies_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('code'); + $table->string('symbol'); + $table->string('name')->nullable(); + $table->boolean('is_default')->default(false); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('currencies'); + } +}; diff --git a/database/migrations/2024_12_04_141400_create_messages_table.php b/database/migrations/2024_12_04_141400_create_messages_table.php new file mode 100644 index 0000000..b37b7ca --- /dev/null +++ b/database/migrations/2024_12_04_141400_create_messages_table.php @@ -0,0 +1,34 @@ +id(); + $table->text('content'); + $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('message_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('messages'); + } +}; diff --git a/database/migrations/2024_12_04_141401_create_product_types_table.php b/database/migrations/2024_12_04_141401_create_product_types_table.php new file mode 100644 index 0000000..fdf1c25 --- /dev/null +++ b/database/migrations/2024_12_04_141401_create_product_types_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_types'); + } +}; diff --git a/database/migrations/2024_12_04_141402_create_product_type_attributes_table.php b/database/migrations/2024_12_04_141402_create_product_type_attributes_table.php new file mode 100644 index 0000000..19c0375 --- /dev/null +++ b/database/migrations/2024_12_04_141402_create_product_type_attributes_table.php @@ -0,0 +1,43 @@ +id(); + $table->string('name'); + $table->enum('type', ["text","boolean","number","select","url","color"]); + $table->boolean('is_translatable')->default(false); + $table->enum('field', ["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]); + $table->boolean('required')->default(false); + $table->integer('rank')->default(0); + $table->string('description')->nullable(); + $table->string('unit')->nullable(); + $table->boolean('is_variant_attribute')->default(false); + $table->json('options')->nullable(); + $table->json('validators')->nullable(); + $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_type_attributes'); + } +}; diff --git a/database/migrations/2024_12_04_141403_create_golden_products_table.php b/database/migrations/2024_12_04_141403_create_golden_products_table.php new file mode 100644 index 0000000..aa1610f --- /dev/null +++ b/database/migrations/2024_12_04_141403_create_golden_products_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_products'); + } +}; diff --git a/database/migrations/2024_12_04_141404_create_golden_product_localizeds_table.php b/database/migrations/2024_12_04_141404_create_golden_product_localizeds_table.php new file mode 100644 index 0000000..a9b0945 --- /dev/null +++ b/database/migrations/2024_12_04_141404_create_golden_product_localizeds_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->text('description')->nullable(); + $table->json('attributes')->nullable(); + $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('locale_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('golden_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_product_localizeds'); + } +}; diff --git a/database/migrations/2024_12_04_141405_create_golden_product_variants_table.php b/database/migrations/2024_12_04_141405_create_golden_product_variants_table.php new file mode 100644 index 0000000..2a3ebc1 --- /dev/null +++ b/database/migrations/2024_12_04_141405_create_golden_product_variants_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('golden_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_product_variants'); + } +}; diff --git a/database/migrations/2024_12_04_141406_create_golden_product_variant_localizeds_table.php b/database/migrations/2024_12_04_141406_create_golden_product_variant_localizeds_table.php new file mode 100644 index 0000000..8e2cfd1 --- /dev/null +++ b/database/migrations/2024_12_04_141406_create_golden_product_variant_localizeds_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('name')->nullable(); + $table->text('description')->nullable(); + $table->json('attributes')->nullable(); + $table->foreignId('golden_product_variant_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('locale_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_product_variant_localizeds'); + } +}; diff --git a/database/migrations/2024_12_04_141407_create_locales_table.php b/database/migrations/2024_12_04_141407_create_locales_table.php new file mode 100644 index 0000000..272da91 --- /dev/null +++ b/database/migrations/2024_12_04_141407_create_locales_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('code'); + $table->string('name'); + $table->boolean('default'); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('locales'); + } +}; diff --git a/database/migrations/2024_12_04_141408_create_seller_user_table.php b/database/migrations/2024_12_04_141408_create_seller_user_table.php new file mode 100644 index 0000000..b124774 --- /dev/null +++ b/database/migrations/2024_12_04_141408_create_seller_user_table.php @@ -0,0 +1,31 @@ +foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('seller_user'); + } +}; From 9c1eb5ea4c452be948fe4372e6d38402a888e8b7 Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 16:06:01 +0100 Subject: [PATCH 12/19] ... --- .../Resources/SellerProductResource.php | 9 ++++-- app/Services/GoldenProductService.php | 31 +++++++++++++++++++ specs.md | 6 ++-- 3 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 app/Services/GoldenProductService.php diff --git a/app/Filament/Seller/Resources/SellerProductResource.php b/app/Filament/Seller/Resources/SellerProductResource.php index e10b1c2..bcb8376 100644 --- a/app/Filament/Seller/Resources/SellerProductResource.php +++ b/app/Filament/Seller/Resources/SellerProductResource.php @@ -5,6 +5,7 @@ use App\Filament\Seller\Resources\SellerProductResource\Pages; use App\Filament\Seller\Resources\SellerProductResource\RelationManagers; use App\Models\SellerProduct; +use App\Services\GoldenProductService; use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; @@ -74,8 +75,12 @@ public static function form(Form $form): Form ]) ->default('draft') ->native(false) - ->helperText('Only Active products can be sold on the marketplace.'), - + ->helperText('Only Active products can be sold on the marketplace.') + ->afterStateUpdated(function ($state, $old, $record) { + if ($state === 'active' && $old !== 'active') { + app(GoldenProductService::class)->createFromSellerProduct($record); + } + }), Forms\Components\Select::make('category_id') ->relationship('category', 'name') ->native(false) diff --git a/app/Services/GoldenProductService.php b/app/Services/GoldenProductService.php new file mode 100644 index 0000000..ead8801 --- /dev/null +++ b/app/Services/GoldenProductService.php @@ -0,0 +1,31 @@ +golden_product_id) { + return $sellerProduct->goldenProduct; + } + + $goldenProduct = GoldenProduct::create([ + 'product_type_id' => $sellerProduct->category->product_type_id ?? 1, + ]); + + // Create localized version + $goldenProduct->translations()->create([ + 'name' => $sellerProduct->name, + 'description' => $sellerProduct->description, + 'locale' => 'en', + ]); + + $sellerProduct->update(['golden_product_id' => $goldenProduct->id]); + + return $goldenProduct; + } +} diff --git a/specs.md b/specs.md index d52fb5f..bc21201 100644 --- a/specs.md +++ b/specs.md @@ -36,15 +36,15 @@ When a seller sets a seller-product to "active", then: - [ ] ... a golden product is created or selected (if EAN or other non-merchant specific article number matches). - [ ] ... the product-type is determined via AI - [ ] ... the attributes (of the seller) are mapped to the attributes of the selected product-type via AI. Attributes may be split or merged during this step (e.g. dimensions). Attributes, that cannot be mapped, will be saved to an unmapped attributes field in the golden record + + - [ ] ... all textual content is translated into the owner's configured locales -- [ ] ... prices and stocks are copied to the golden product and marked with the seller's ID (existing entities must get the prefix Seller*) -- [ ] ... images are copied to the golden product (with seller ID). AI chooses one set of products and marks it, so the shop can use it. - [ ] If there is already a golden record that is related to a seller-product then .... - [ ] If there is already a golden record that is not yet related to a seller-product, but has the same EAN then .... - [ ] TODO Variant creation # Owner - Golden Products -- [ ] As an Owner, I can see a list of all Golden Products. I can also see the number of related seller-products (from different sellers that sell the same product). +- [x] As an Owner, I can see a list of all Golden Products. I can also see the number of related seller-products (from different sellers that sell the same product). - [ ] As an owner, I see the selected images for each golden product - [ ] As an owner, I see the stock levels of the golden product (accross sellers) - [ ] As an owner, there is a status badge for "new" and "updated" From 5534ae93e36647a7752909c6497b981c25ef3799 Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 17:54:59 +0100 Subject: [PATCH 13/19] ... --- .blueprint | 42 +- .../Owner/Resources/GoldenProductResource.php | 8 +- .../{OrderResource.php => LocaleResource.php} | 50 +- .../LocaleResource/Pages/CreateLocale.php | 12 + .../LocaleResource/Pages/EditLocale.php | 35 + .../LocaleResource/Pages/ListLocales.php | 19 + .../OrderResource/Pages/CreateOrder.php | 12 - .../OrderResource/Pages/EditOrder.php | 19 - .../OrderResource/Pages/ListOrders.php | 19 - .../Resources/SellerProductResource.php | 2 - app/Models/GoldenProductLocalized.php | 7 - app/Services/GoldenProductService.php | 134 +- app/Services/OpenAIService.php | 26 + composer.json | 6 +- composer.lock | 228 ++- .../GoldenProductLocalizedFactory.php | 2 - ...024_12_04_163110_create_sellers_table.php} | 0 ...2_04_163111_create_partnerships_table.php} | 0 ...12_04_163112_create_seller_data_table.php} | 0 ..._12_04_163113_create_categories_table.php} | 0 ...4_163114_create_seller_products_table.php} | 0 ...15_create_seller_product_images_table.php} | 0 ...4_163116_create_seller_variants_table.php} | 0 ...2024_12_04_163117_create_prices_table.php} | 0 ...2024_12_04_163118_create_stocks_table.php} | 0 ...4_12_04_163119_create_locations_table.php} | 0 ..._12_04_163120_create_currencies_table.php} | 0 ...24_12_04_163121_create_messages_table.php} | 0 ..._04_163122_create_product_types_table.php} | 0 ..._create_product_type_attributes_table.php} | 0 ...4_163124_create_golden_products_table.php} | 0 ...reate_golden_product_localizeds_table.php} | 1 - ..._create_golden_product_variants_table.php} | 0 ...lden_product_variant_localizeds_table.php} | 0 ...024_12_04_163128_create_locales_table.php} | 0 ...12_04_163129_create_seller_user_table.php} | 0 database/seeders/AttributeSeeder.php | 88 ++ database/seeders/CategorySeeder.php | 60 + database/seeders/DatabaseSeeder.php | 1261 +---------------- database/seeders/LocaleSeeder.php | 34 + database/seeders/LocationSeeder.php | 48 + database/seeders/ProductSeeder.php | 201 +++ database/seeders/ProductTypeSeeder.php | 23 + database/seeders/SellerDataSeeder.php | 34 + database/seeders/UserSeeder.php | 64 + draft.yaml | 1 - 46 files changed, 1054 insertions(+), 1382 deletions(-) rename app/Filament/Owner/Resources/{OrderResource.php => LocaleResource.php} (51%) create mode 100644 app/Filament/Owner/Resources/LocaleResource/Pages/CreateLocale.php create mode 100644 app/Filament/Owner/Resources/LocaleResource/Pages/EditLocale.php create mode 100644 app/Filament/Owner/Resources/LocaleResource/Pages/ListLocales.php delete mode 100644 app/Filament/Owner/Resources/OrderResource/Pages/CreateOrder.php delete mode 100644 app/Filament/Owner/Resources/OrderResource/Pages/EditOrder.php delete mode 100644 app/Filament/Owner/Resources/OrderResource/Pages/ListOrders.php create mode 100644 app/Services/OpenAIService.php rename database/migrations/{2024_12_04_141349_create_sellers_table.php => 2024_12_04_163110_create_sellers_table.php} (100%) rename database/migrations/{2024_12_04_141350_create_partnerships_table.php => 2024_12_04_163111_create_partnerships_table.php} (100%) rename database/migrations/{2024_12_04_141351_create_seller_data_table.php => 2024_12_04_163112_create_seller_data_table.php} (100%) rename database/migrations/{2024_12_04_141352_create_categories_table.php => 2024_12_04_163113_create_categories_table.php} (100%) rename database/migrations/{2024_12_04_141353_create_seller_products_table.php => 2024_12_04_163114_create_seller_products_table.php} (100%) rename database/migrations/{2024_12_04_141354_create_seller_product_images_table.php => 2024_12_04_163115_create_seller_product_images_table.php} (100%) rename database/migrations/{2024_12_04_141355_create_seller_variants_table.php => 2024_12_04_163116_create_seller_variants_table.php} (100%) rename database/migrations/{2024_12_04_141356_create_prices_table.php => 2024_12_04_163117_create_prices_table.php} (100%) rename database/migrations/{2024_12_04_141357_create_stocks_table.php => 2024_12_04_163118_create_stocks_table.php} (100%) rename database/migrations/{2024_12_04_141358_create_locations_table.php => 2024_12_04_163119_create_locations_table.php} (100%) rename database/migrations/{2024_12_04_141359_create_currencies_table.php => 2024_12_04_163120_create_currencies_table.php} (100%) rename database/migrations/{2024_12_04_141400_create_messages_table.php => 2024_12_04_163121_create_messages_table.php} (100%) rename database/migrations/{2024_12_04_141401_create_product_types_table.php => 2024_12_04_163122_create_product_types_table.php} (100%) rename database/migrations/{2024_12_04_141402_create_product_type_attributes_table.php => 2024_12_04_163123_create_product_type_attributes_table.php} (100%) rename database/migrations/{2024_12_04_141403_create_golden_products_table.php => 2024_12_04_163124_create_golden_products_table.php} (100%) rename database/migrations/{2024_12_04_141404_create_golden_product_localizeds_table.php => 2024_12_04_163125_create_golden_product_localizeds_table.php} (90%) rename database/migrations/{2024_12_04_141405_create_golden_product_variants_table.php => 2024_12_04_163126_create_golden_product_variants_table.php} (100%) rename database/migrations/{2024_12_04_141406_create_golden_product_variant_localizeds_table.php => 2024_12_04_163127_create_golden_product_variant_localizeds_table.php} (100%) rename database/migrations/{2024_12_04_141407_create_locales_table.php => 2024_12_04_163128_create_locales_table.php} (100%) rename database/migrations/{2024_12_04_141408_create_seller_user_table.php => 2024_12_04_163129_create_seller_user_table.php} (100%) create mode 100644 database/seeders/AttributeSeeder.php create mode 100644 database/seeders/CategorySeeder.php create mode 100644 database/seeders/LocaleSeeder.php create mode 100644 database/seeders/LocationSeeder.php create mode 100644 database/seeders/ProductSeeder.php create mode 100644 database/seeders/ProductTypeSeeder.php create mode 100644 database/seeders/SellerDataSeeder.php create mode 100644 database/seeders/UserSeeder.php diff --git a/.blueprint b/.blueprint index 7a25a93..fdf59f4 100644 --- a/.blueprint +++ b/.blueprint @@ -18,26 +18,26 @@ created: - database/factories/GoldenProductVariantFactory.php - database/factories/GoldenProductVariantLocalizedFactory.php - database/factories/LocaleFactory.php - - database/migrations/2024_12_04_141349_create_sellers_table.php - - database/migrations/2024_12_04_141350_create_partnerships_table.php - - database/migrations/2024_12_04_141351_create_seller_data_table.php - - database/migrations/2024_12_04_141352_create_categories_table.php - - database/migrations/2024_12_04_141353_create_seller_products_table.php - - database/migrations/2024_12_04_141354_create_seller_product_images_table.php - - database/migrations/2024_12_04_141355_create_seller_variants_table.php - - database/migrations/2024_12_04_141356_create_prices_table.php - - database/migrations/2024_12_04_141357_create_stocks_table.php - - database/migrations/2024_12_04_141358_create_locations_table.php - - database/migrations/2024_12_04_141359_create_currencies_table.php - - database/migrations/2024_12_04_141400_create_messages_table.php - - database/migrations/2024_12_04_141401_create_product_types_table.php - - database/migrations/2024_12_04_141402_create_product_type_attributes_table.php - - database/migrations/2024_12_04_141403_create_golden_products_table.php - - database/migrations/2024_12_04_141404_create_golden_product_localizeds_table.php - - database/migrations/2024_12_04_141405_create_golden_product_variants_table.php - - database/migrations/2024_12_04_141406_create_golden_product_variant_localizeds_table.php - - database/migrations/2024_12_04_141407_create_locales_table.php - - database/migrations/2024_12_04_141408_create_seller_user_table.php + - database/migrations/2024_12_04_163110_create_sellers_table.php + - database/migrations/2024_12_04_163111_create_partnerships_table.php + - database/migrations/2024_12_04_163112_create_seller_data_table.php + - database/migrations/2024_12_04_163113_create_categories_table.php + - database/migrations/2024_12_04_163114_create_seller_products_table.php + - database/migrations/2024_12_04_163115_create_seller_product_images_table.php + - database/migrations/2024_12_04_163116_create_seller_variants_table.php + - database/migrations/2024_12_04_163117_create_prices_table.php + - database/migrations/2024_12_04_163118_create_stocks_table.php + - database/migrations/2024_12_04_163119_create_locations_table.php + - database/migrations/2024_12_04_163120_create_currencies_table.php + - database/migrations/2024_12_04_163121_create_messages_table.php + - database/migrations/2024_12_04_163122_create_product_types_table.php + - database/migrations/2024_12_04_163123_create_product_type_attributes_table.php + - database/migrations/2024_12_04_163124_create_golden_products_table.php + - database/migrations/2024_12_04_163125_create_golden_product_localizeds_table.php + - database/migrations/2024_12_04_163126_create_golden_product_variants_table.php + - database/migrations/2024_12_04_163127_create_golden_product_variant_localizeds_table.php + - database/migrations/2024_12_04_163128_create_locales_table.php + - database/migrations/2024_12_04_163129_create_seller_user_table.php - app/Models/Seller.php - app/Models/Partnership.php - app/Models/SellerData.php @@ -77,7 +77,7 @@ models: ProductType: { name: string, relationships: { hasMany: 'ProductTypeAttribute:attribute, GoldenProduct:product' } } ProductTypeAttribute: { name: string, type: 'enum:text,boolean,number,select,url,color', is_translatable: 'boolean default:false', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', options: 'json nullable', validators: 'json nullable', product_type_id: 'id foreign' } GoldenProduct: { product_type_id: 'id foreign', relationships: { hasMany: 'GoldenProductLocalized:translation, SellerProduct, GoldenProductVariant:variant' } } - GoldenProductLocalized: { name: string, description: 'text nullable', attributes: 'json nullable', product_type_id: 'id foreign', locale_id: 'id foreign', golden_product_id: 'id foreign' } + GoldenProductLocalized: { name: string, description: 'text nullable', attributes: 'json nullable', locale_id: 'id foreign', golden_product_id: 'id foreign' } GoldenProductVariant: { golden_product_id: 'id foreign', relationships: { hasMany: 'GoldenProductVariantLocalized:translation' } } GoldenProductVariantLocalized: { name: 'string nullable', description: 'text nullable', attributes: 'json nullable', golden_product_variant_id: 'id foreign', locale_id: 'id foreign' } Locale: { code: string, name: string, default: boolean } diff --git a/app/Filament/Owner/Resources/GoldenProductResource.php b/app/Filament/Owner/Resources/GoldenProductResource.php index 58d59b0..8da90f0 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource.php +++ b/app/Filament/Owner/Resources/GoldenProductResource.php @@ -142,10 +142,10 @@ public static function form(Form $form): Form ->required(), ]), - Section::make('Attributes') - ->schema(fn(Get $get): array => static::getAttributeFields($get('product_type_id'))) - ->columns(2) - ->visible(fn(Get $get): bool => (bool) $get('product_type_id')), + // Section::make('Attributes') + // ->schema(fn(Get $get): array => static::getAttributeFields($get('product_type_id'))) + // ->columns(2) + // ->visible(fn(Get $get): bool => (bool) $get('product_type_id')), ]); } diff --git a/app/Filament/Owner/Resources/OrderResource.php b/app/Filament/Owner/Resources/LocaleResource.php similarity index 51% rename from app/Filament/Owner/Resources/OrderResource.php rename to app/Filament/Owner/Resources/LocaleResource.php index ff64f1b..7e37b63 100644 --- a/app/Filament/Owner/Resources/OrderResource.php +++ b/app/Filament/Owner/Resources/LocaleResource.php @@ -2,9 +2,9 @@ namespace App\Filament\Owner\Resources; -use App\Filament\Owner\Resources\OrderResource\Pages; -use App\Filament\Owner\Resources\OrderResource\RelationManagers; -use App\Models\Order; +use App\Filament\Owner\Resources\LocaleResource\Pages; +use App\Filament\Owner\Resources\LocaleResource\RelationManagers; +use App\Models\Locale; use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; @@ -13,32 +13,26 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; -class OrderResource extends Resource +class LocaleResource extends Resource { - protected static ?string $model = Order::class; + protected static ?string $model = Locale::class; - protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack'; + protected static ?string $navigationIcon = 'heroicon-o-language'; + + protected static ?string $navigationLabel = 'Languages'; + + protected static ?string $navigationGroup = 'Configuration'; public static function form(Form $form): Form { return $form ->schema([ - Forms\Components\TextInput::make('order_number') + Forms\Components\TextInput::make('code') ->required(), - Forms\Components\TextInput::make('status') + Forms\Components\TextInput::make('name') ->required(), - Forms\Components\TextInput::make('total_amount') - ->required() - ->numeric(), - Forms\Components\Select::make('seller_id') - ->relationship('seller', 'name') + Forms\Components\Toggle::make('default') ->required(), - Forms\Components\Textarea::make('shipping_address') - ->required() - ->columnSpanFull(), - Forms\Components\Textarea::make('billing_address') - ->required() - ->columnSpanFull(), ]); } @@ -46,16 +40,12 @@ public static function table(Table $table): Table { return $table ->columns([ - Tables\Columns\TextColumn::make('order_number') + Tables\Columns\TextColumn::make('code') ->searchable(), - Tables\Columns\TextColumn::make('status') + Tables\Columns\TextColumn::make('name') ->searchable(), - Tables\Columns\TextColumn::make('total_amount') - ->numeric() - ->sortable(), - Tables\Columns\TextColumn::make('seller.name') - ->numeric() - ->sortable(), + Tables\Columns\IconColumn::make('default') + ->boolean(), Tables\Columns\TextColumn::make('created_at') ->dateTime() ->sortable() @@ -88,9 +78,9 @@ public static function getRelations(): array public static function getPages(): array { return [ - 'index' => Pages\ListOrders::route('/'), - 'create' => Pages\CreateOrder::route('/create'), - 'edit' => Pages\EditOrder::route('/{record}/edit'), + 'index' => Pages\ListLocales::route('/'), + 'create' => Pages\CreateLocale::route('/create'), + 'edit' => Pages\EditLocale::route('/{record}/edit'), ]; } } diff --git a/app/Filament/Owner/Resources/LocaleResource/Pages/CreateLocale.php b/app/Filament/Owner/Resources/LocaleResource/Pages/CreateLocale.php new file mode 100644 index 0000000..ac24eb6 --- /dev/null +++ b/app/Filament/Owner/Resources/LocaleResource/Pages/CreateLocale.php @@ -0,0 +1,12 @@ +default) { + // If setting this locale as default, remove default from other locales + Locale::where('id', '!=', $record->id) + ->where('default', true) + ->update(['default' => false]); + } + + $record->update($data); + + return $record; + } +} diff --git a/app/Filament/Owner/Resources/LocaleResource/Pages/ListLocales.php b/app/Filament/Owner/Resources/LocaleResource/Pages/ListLocales.php new file mode 100644 index 0000000..8a9d024 --- /dev/null +++ b/app/Filament/Owner/Resources/LocaleResource/Pages/ListLocales.php @@ -0,0 +1,19 @@ +helperText('The display name for this product'), Forms\Components\TextInput::make('brand') - ->required() ->helperText('The brand this product') ->datalist(function () { return \App\Models\SellerProduct::query() @@ -84,7 +83,6 @@ public static function form(Form $form): Form Forms\Components\Select::make('category_id') ->relationship('category', 'name') ->native(false) - ->required() ->helperText('The category this product belongs to'), Forms\Components\TextInput::make('sku') diff --git a/app/Models/GoldenProductLocalized.php b/app/Models/GoldenProductLocalized.php index 55f2dac..cf961fb 100644 --- a/app/Models/GoldenProductLocalized.php +++ b/app/Models/GoldenProductLocalized.php @@ -19,7 +19,6 @@ class GoldenProductLocalized extends Model 'name', 'description', 'attributes', - 'product_type_id', 'locale_id', 'golden_product_id', ]; @@ -32,16 +31,10 @@ class GoldenProductLocalized extends Model protected $casts = [ 'id' => 'integer', 'attributes' => 'array', - 'product_type_id' => 'integer', 'locale_id' => 'integer', 'golden_product_id' => 'integer', ]; - public function productType(): BelongsTo - { - return $this->belongsTo(ProductType::class); - } - public function locale(): BelongsTo { return $this->belongsTo(Locale::class); diff --git a/app/Services/GoldenProductService.php b/app/Services/GoldenProductService.php index ead8801..99b3368 100644 --- a/app/Services/GoldenProductService.php +++ b/app/Services/GoldenProductService.php @@ -4,28 +4,144 @@ use App\Models\GoldenProduct; use App\Models\SellerProduct; +use App\Models\ProductType; +use App\Models\Locale; +use App\Services\OpenAIService; class GoldenProductService { + private $openAIService; + + public function __construct(OpenAIService $openAIService) + { + $this->openAIService = $openAIService; + } + public function createFromSellerProduct(SellerProduct $sellerProduct): GoldenProduct { if ($sellerProduct->golden_product_id) { return $sellerProduct->goldenProduct; } + $productTypeId = $this->determineProductType($sellerProduct); + + // TODO handle the case when the product type is not found + $goldenProduct = GoldenProduct::create([ - 'product_type_id' => $sellerProduct->category->product_type_id ?? 1, + 'product_type_id' => $productTypeId, ]); - - // Create localized version - $goldenProduct->translations()->create([ - 'name' => $sellerProduct->name, - 'description' => $sellerProduct->description, - 'locale' => 'en', - ]); - + + // Create translations with attributes for each locale + foreach (Locale::all() as $locale) { + $translatedName = $this->translateProductData($sellerProduct->name, $locale->code); + $translatedDescription = $this->translateProductData($sellerProduct->description, $locale->code); + + // Translate attributes if they exist + $translatedAttributes = null; + if ($sellerProduct->attributes) { + $translatedAttributes = json_decode($this->translateProductData( + json_encode($sellerProduct->attributes), + $locale->code + ), true); + } + + $goldenProduct->translations()->create([ + 'name' => $translatedName, + 'description' => $translatedDescription, + 'attributes' => $translatedAttributes, + 'locale_id' => $locale->id, + ]); + } + $sellerProduct->update(['golden_product_id' => $goldenProduct->id]); return $goldenProduct; } + + private function determineProductType(SellerProduct $sellerProduct): int + { + $client = $this->openAIService->getClient(); + + $availableTypes = ProductType::pluck('name')->toArray(); + + $response = $client->chat()->create([ + 'model' => $this->openAIService->getSmallModel(), + 'messages' => [ + ['role' => 'user', 'content' => $sellerProduct->name], + ], + 'tools' => [ + [ + 'type' => 'function', + 'function' => [ + 'name' => 'classify_product', + 'description' => 'Classify a product into predefined product types', + 'parameters' => [ + 'type' => 'object', + 'properties' => [ + 'product_type' => [ + 'type' => 'string', + 'enum' => $availableTypes, + 'description' => 'The type of product', + ], + 'confidence' => [ + 'type' => 'number', + 'minimum' => 0, + 'maximum' => 1, + 'description' => 'Confidence level in the classification', + ], + ], + 'required' => ['product_type', 'confidence'], + ], + ], + ], + ], + ]); + + + + $toolCall = $response->choices[0]->message->toolCalls[0]; + $arguments = json_decode($toolCall->function->arguments, true); + $productType = ProductType::where('name', $arguments['product_type'])->first(); + + return $productType ? $productType->id : null; + } + + private function translateProductData(string $text, string $targetLocale): string + { + $client = $this->openAIService->getClient(); + + $response = $client->chat()->create([ + 'model' => $this->openAIService->getSmallModel(), + 'messages' => [ + [ + 'role' => 'user', + 'content' => "Translate the following text to {$targetLocale}:\n\n{$text}" + ], + ], + 'tools' => [ + [ + 'type' => 'function', + 'function' => [ + 'name' => 'translate_text', + 'description' => 'Translate text to the target language while maintaining the original meaning and tone', + 'parameters' => [ + 'type' => 'object', + 'properties' => [ + 'translated_text' => [ + 'type' => 'string', + 'description' => 'The translated text in the target language', + ], + ], + 'required' => ['translated_text'], + ], + ], + ], + ], + ]); + + $toolCall = $response->choices[0]->message->toolCalls[0]; + $arguments = json_decode($toolCall->function->arguments, true); + + return $arguments['translated_text']; + } } diff --git a/app/Services/OpenAIService.php b/app/Services/OpenAIService.php new file mode 100644 index 0000000..0852ad3 --- /dev/null +++ b/app/Services/OpenAIService.php @@ -0,0 +1,26 @@ +client = OpenAI::client(getenv('OPENAI_API_KEY')); + } + + public function getClient() + { + return $this->client; + } + + public function getSmallModel() + { + return getenv('SMALL_MODEL'); + } +} diff --git a/composer.json b/composer.json index ee76014..28461f9 100644 --- a/composer.json +++ b/composer.json @@ -9,10 +9,12 @@ "license": "MIT", "require": { "php": "^8.2", + "fakerphp/faker": "^1.23", "filament/filament": "^3.2", + "guzzlehttp/guzzle": "^7.9", "laravel/framework": "^11.9", "laravel/tinker": "^2.9", - "fakerphp/faker": "^1.23" + "openai-php/client": "^0.10.3" }, "require-dev": { "laravel-shift/blueprint": "^2.10", @@ -74,4 +76,4 @@ }, "minimum-stability": "stable", "prefer-stable": true -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index 1fa15f8..af3d2ed 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0f494d504df14401f597608ad22b3e41", + "content-hash": "715c7565471a0a766d89c818c8a525cf", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -3769,6 +3769,97 @@ ], "time": "2024-11-21T10:39:51+00:00" }, + { + "name": "openai-php/client", + "version": "v0.10.3", + "source": { + "type": "git", + "url": "https://github.com/openai-php/client.git", + "reference": "4a565d145e0fb3ea1baba8fffe39d86c56b6dc2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/openai-php/client/zipball/4a565d145e0fb3ea1baba8fffe39d86c56b6dc2c", + "reference": "4a565d145e0fb3ea1baba8fffe39d86c56b6dc2c", + "shasum": "" + }, + "require": { + "php": "^8.1.0", + "php-http/discovery": "^1.20.0", + "php-http/multipart-stream-builder": "^1.4.2", + "psr/http-client": "^1.0.3", + "psr/http-client-implementation": "^1.0.1", + "psr/http-factory-implementation": "*", + "psr/http-message": "^1.1.0|^2.0.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.9.2", + "guzzlehttp/psr7": "^2.7.0", + "laravel/pint": "^1.18.1", + "mockery/mockery": "^1.6.12", + "nunomaduro/collision": "^7.11.0|^8.5.0", + "pestphp/pest": "^2.36.0|^3.5.0", + "pestphp/pest-plugin-arch": "^2.7|^3.0", + "pestphp/pest-plugin-type-coverage": "^2.8.7|^3.1.0", + "phpstan/phpstan": "^1.12.7", + "symfony/var-dumper": "^6.4.11|^7.1.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/OpenAI.php" + ], + "psr-4": { + "OpenAI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + }, + { + "name": "Sandro Gehri" + } + ], + "description": "OpenAI PHP is a supercharged PHP API client that allows you to interact with the Open AI API", + "keywords": [ + "GPT-3", + "api", + "client", + "codex", + "dall-e", + "language", + "natural", + "openai", + "php", + "processing", + "sdk" + ], + "support": { + "issues": "https://github.com/openai-php/client/issues", + "source": "https://github.com/openai-php/client/tree/v0.10.3" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/gehrisandro", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-11-12T20:51:16+00:00" + }, { "name": "openspout/openspout", "version": "v4.28.0", @@ -3862,6 +3953,141 @@ ], "time": "2024-11-29T09:45:53+00:00" }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" + }, + "time": "2024-10-02T11:20:13+00:00" + }, + { + "name": "php-http/multipart-stream-builder", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/multipart-stream-builder.git", + "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/10086e6de6f53489cca5ecc45b6f468604d3460e", + "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/discovery": "^1.15", + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "nyholm/psr7": "^1.0", + "php-http/message": "^1.5", + "php-http/message-factory": "^1.0.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Message\\MultipartStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "A builder class that help you create a multipart stream", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "multipart stream", + "stream" + ], + "support": { + "issues": "https://github.com/php-http/multipart-stream-builder/issues", + "source": "https://github.com/php-http/multipart-stream-builder/tree/1.4.2" + }, + "time": "2024-09-04T13:22:54+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.3", diff --git a/database/factories/GoldenProductLocalizedFactory.php b/database/factories/GoldenProductLocalizedFactory.php index 84a4b56..52dea8b 100644 --- a/database/factories/GoldenProductLocalizedFactory.php +++ b/database/factories/GoldenProductLocalizedFactory.php @@ -7,7 +7,6 @@ use App\Models\GoldenProduct; use App\Models\GoldenProductLocalized; use App\Models\Locale; -use App\Models\ProductType; class GoldenProductLocalizedFactory extends Factory { @@ -27,7 +26,6 @@ public function definition(): array 'name' => $this->faker->name(), 'description' => $this->faker->text(), 'attributes' => '{}', - 'product_type_id' => ProductType::factory(), 'locale_id' => Locale::factory(), 'golden_product_id' => GoldenProduct::factory(), ]; diff --git a/database/migrations/2024_12_04_141349_create_sellers_table.php b/database/migrations/2024_12_04_163110_create_sellers_table.php similarity index 100% rename from database/migrations/2024_12_04_141349_create_sellers_table.php rename to database/migrations/2024_12_04_163110_create_sellers_table.php diff --git a/database/migrations/2024_12_04_141350_create_partnerships_table.php b/database/migrations/2024_12_04_163111_create_partnerships_table.php similarity index 100% rename from database/migrations/2024_12_04_141350_create_partnerships_table.php rename to database/migrations/2024_12_04_163111_create_partnerships_table.php diff --git a/database/migrations/2024_12_04_141351_create_seller_data_table.php b/database/migrations/2024_12_04_163112_create_seller_data_table.php similarity index 100% rename from database/migrations/2024_12_04_141351_create_seller_data_table.php rename to database/migrations/2024_12_04_163112_create_seller_data_table.php diff --git a/database/migrations/2024_12_04_141352_create_categories_table.php b/database/migrations/2024_12_04_163113_create_categories_table.php similarity index 100% rename from database/migrations/2024_12_04_141352_create_categories_table.php rename to database/migrations/2024_12_04_163113_create_categories_table.php diff --git a/database/migrations/2024_12_04_141353_create_seller_products_table.php b/database/migrations/2024_12_04_163114_create_seller_products_table.php similarity index 100% rename from database/migrations/2024_12_04_141353_create_seller_products_table.php rename to database/migrations/2024_12_04_163114_create_seller_products_table.php diff --git a/database/migrations/2024_12_04_141354_create_seller_product_images_table.php b/database/migrations/2024_12_04_163115_create_seller_product_images_table.php similarity index 100% rename from database/migrations/2024_12_04_141354_create_seller_product_images_table.php rename to database/migrations/2024_12_04_163115_create_seller_product_images_table.php diff --git a/database/migrations/2024_12_04_141355_create_seller_variants_table.php b/database/migrations/2024_12_04_163116_create_seller_variants_table.php similarity index 100% rename from database/migrations/2024_12_04_141355_create_seller_variants_table.php rename to database/migrations/2024_12_04_163116_create_seller_variants_table.php diff --git a/database/migrations/2024_12_04_141356_create_prices_table.php b/database/migrations/2024_12_04_163117_create_prices_table.php similarity index 100% rename from database/migrations/2024_12_04_141356_create_prices_table.php rename to database/migrations/2024_12_04_163117_create_prices_table.php diff --git a/database/migrations/2024_12_04_141357_create_stocks_table.php b/database/migrations/2024_12_04_163118_create_stocks_table.php similarity index 100% rename from database/migrations/2024_12_04_141357_create_stocks_table.php rename to database/migrations/2024_12_04_163118_create_stocks_table.php diff --git a/database/migrations/2024_12_04_141358_create_locations_table.php b/database/migrations/2024_12_04_163119_create_locations_table.php similarity index 100% rename from database/migrations/2024_12_04_141358_create_locations_table.php rename to database/migrations/2024_12_04_163119_create_locations_table.php diff --git a/database/migrations/2024_12_04_141359_create_currencies_table.php b/database/migrations/2024_12_04_163120_create_currencies_table.php similarity index 100% rename from database/migrations/2024_12_04_141359_create_currencies_table.php rename to database/migrations/2024_12_04_163120_create_currencies_table.php diff --git a/database/migrations/2024_12_04_141400_create_messages_table.php b/database/migrations/2024_12_04_163121_create_messages_table.php similarity index 100% rename from database/migrations/2024_12_04_141400_create_messages_table.php rename to database/migrations/2024_12_04_163121_create_messages_table.php diff --git a/database/migrations/2024_12_04_141401_create_product_types_table.php b/database/migrations/2024_12_04_163122_create_product_types_table.php similarity index 100% rename from database/migrations/2024_12_04_141401_create_product_types_table.php rename to database/migrations/2024_12_04_163122_create_product_types_table.php diff --git a/database/migrations/2024_12_04_141402_create_product_type_attributes_table.php b/database/migrations/2024_12_04_163123_create_product_type_attributes_table.php similarity index 100% rename from database/migrations/2024_12_04_141402_create_product_type_attributes_table.php rename to database/migrations/2024_12_04_163123_create_product_type_attributes_table.php diff --git a/database/migrations/2024_12_04_141403_create_golden_products_table.php b/database/migrations/2024_12_04_163124_create_golden_products_table.php similarity index 100% rename from database/migrations/2024_12_04_141403_create_golden_products_table.php rename to database/migrations/2024_12_04_163124_create_golden_products_table.php diff --git a/database/migrations/2024_12_04_141404_create_golden_product_localizeds_table.php b/database/migrations/2024_12_04_163125_create_golden_product_localizeds_table.php similarity index 90% rename from database/migrations/2024_12_04_141404_create_golden_product_localizeds_table.php rename to database/migrations/2024_12_04_163125_create_golden_product_localizeds_table.php index a9b0945..51f8eb9 100644 --- a/database/migrations/2024_12_04_141404_create_golden_product_localizeds_table.php +++ b/database/migrations/2024_12_04_163125_create_golden_product_localizeds_table.php @@ -18,7 +18,6 @@ public function up(): void $table->string('name'); $table->text('description')->nullable(); $table->json('attributes')->nullable(); - $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); $table->foreignId('locale_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); $table->foreignId('golden_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); $table->timestamps(); diff --git a/database/migrations/2024_12_04_141405_create_golden_product_variants_table.php b/database/migrations/2024_12_04_163126_create_golden_product_variants_table.php similarity index 100% rename from database/migrations/2024_12_04_141405_create_golden_product_variants_table.php rename to database/migrations/2024_12_04_163126_create_golden_product_variants_table.php diff --git a/database/migrations/2024_12_04_141406_create_golden_product_variant_localizeds_table.php b/database/migrations/2024_12_04_163127_create_golden_product_variant_localizeds_table.php similarity index 100% rename from database/migrations/2024_12_04_141406_create_golden_product_variant_localizeds_table.php rename to database/migrations/2024_12_04_163127_create_golden_product_variant_localizeds_table.php diff --git a/database/migrations/2024_12_04_141407_create_locales_table.php b/database/migrations/2024_12_04_163128_create_locales_table.php similarity index 100% rename from database/migrations/2024_12_04_141407_create_locales_table.php rename to database/migrations/2024_12_04_163128_create_locales_table.php diff --git a/database/migrations/2024_12_04_141408_create_seller_user_table.php b/database/migrations/2024_12_04_163129_create_seller_user_table.php similarity index 100% rename from database/migrations/2024_12_04_141408_create_seller_user_table.php rename to database/migrations/2024_12_04_163129_create_seller_user_table.php diff --git a/database/seeders/AttributeSeeder.php b/database/seeders/AttributeSeeder.php new file mode 100644 index 0000000..ecfd4e2 --- /dev/null +++ b/database/seeders/AttributeSeeder.php @@ -0,0 +1,88 @@ + [ + [ + 'name' => 'size', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'options' => ['36', '37', '38', '39', '40', '41', '42', '43', '44', '45'] + ], + [ + 'name' => 'color', + 'type' => 'select', + 'field' => 'ColorPicker', + 'required' => true, + 'options' => ['Black', 'White', 'Red', 'Blue', 'Grey'] + ] + ], + 'T-Shirt' => [ + [ + 'name' => 'size', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'options' => ['XS', 'S', 'M', 'L', 'XL', 'XXL'] + ], + [ + 'name' => 'color', + 'type' => 'select', + 'field' => 'ColorPicker', + 'required' => true, + 'options' => ['Black', 'White', 'Navy', 'Grey', 'Red'] + ] + ], + 'Jeans' => [ + [ + 'name' => 'size', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'options' => ['28/30', '30/30', '32/30', '34/30', '36/30', '28/32', '30/32', '32/32', '34/32', '36/32'] + ], + [ + 'name' => 'wash', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'options' => ['Light', 'Medium', 'Dark', 'Black', 'Raw'] + ] + ], + 'Dress' => [ + [ + 'name' => 'size', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'options' => ['XS', 'S', 'M', 'L', 'XL'] + ], + [ + 'name' => 'color', + 'type' => 'select', + 'field' => 'ColorPicker', + 'required' => true, + 'options' => ['Black', 'Navy', 'Red', 'White', 'Floral'] + ] + ] + ]; + + foreach ($attributesByType as $typeName => $attributes) { + $productType = ProductType::where('name', $typeName)->first(); + if ($productType) { + foreach ($attributes as $attributeData) { + $productType->attributes()->create($attributeData); + } + } + } + } +} diff --git a/database/seeders/CategorySeeder.php b/database/seeders/CategorySeeder.php new file mode 100644 index 0000000..aaa96b6 --- /dev/null +++ b/database/seeders/CategorySeeder.php @@ -0,0 +1,60 @@ + 'Root', + 'description' => 'Root category for all products', + 'is_active' => true, + 'parent_id' => null, + ]); + + // Create main fashion category + Category::create([ + 'name' => 'Fashion', + 'description' => 'Clothing, shoes, accessories, and jewelry', + 'is_active' => true, + 'parent_id' => 1, + ]); + + // Create fashion subcategories + $subCategories = [ + [ + 'name' => 'Women\'s Clothing', + 'description' => 'Dresses, tops, skirts and more for women', + 'is_active' => true, + 'parent_id' => 2, + ], + [ + 'name' => 'Men\'s Clothing', + 'description' => 'Shirts, pants, suits and more for men', + 'is_active' => true, + 'parent_id' => 2, + ], + [ + 'name' => 'Shoes', + 'description' => 'Athletic shoes, boots, sandals, and more', + 'is_active' => true, + 'parent_id' => 2, + ], + [ + 'name' => 'Accessories', + 'description' => 'Hats, scarves, belts, and more', + 'is_active' => true, + 'parent_id' => 2, + ], + ]; + + foreach ($subCategories as $category) { + Category::create($category); + } + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index f7859c3..a6c3e29 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,1264 +2,21 @@ namespace Database\Seeders; -use App\Models\User; -use App\Models\Category; -use App\Models\SellerProduct; -use App\Models\Status; -use App\Models\SellerVariant; -use App\Models\Location; -use App\Models\Stock; -use App\Models\Currency; -use App\Models\Price; -use App\Models\Operator; -use App\Models\Partnership; -use App\Models\ProductType; -use App\Models\GoldenProduct; use Illuminate\Database\Seeder; -use Illuminate\Support\Facades\DB; class DatabaseSeeder extends Seeder { - /** - * Seed the application's database. - */ public function run(): void { - - // Create user r - $ownerUser = \App\Models\User::factory()->create([ - 'name' => 'Mr Operator', - 'email' => 'owner@ossc.tech', - 'password' => bcrypt('owner@ossc.tech'), - 'is_seller' => false, - ]); - - $sellerUser = \App\Models\User::factory()->create([ - 'name' => 'Mr Seller', - 'email' => 'seller@ossc.tech', - 'password' => bcrypt('seller@ossc.tech'), - 'is_seller' => true, - ]); - - $seller = \App\Models\Seller::create([ - 'name' => 'BarSeller' - ]); - - $sellerUser->sellers()->attach($seller); - - $partnership = Partnership::create([ - 'seller_id' => $seller->id, - 'status' => 'submitted', - 'notes' => 'Initial partnership application' - ]); - - $sellerData = \App\Models\SellerData::create([ - 'seller_id' => $seller->id, - 'description' => 'BarSeller Inc. is a company that sells wooden furniture.', - 'company_name' => 'BarSeller Inc.', - 'address_line1' => '123 Market Street', - 'address_line2' => 'Suite 456', - 'city' => 'San Francisco', - 'state' => 'CA', - 'postal_code' => '94105', - 'country_code' => 'US', - 'phone' => '+1-415-555-0123', - 'vat' => 'US123456789', - 'tin' => '12-3456789', - 'eori' => 'US12345678901234', - 'iban' => 'US123456789012345678901234', - 'swift_bic' => 'CHASUS33XXX', - 'bank_name' => 'Chase Bank' + $this->call([ + UserSeeder::class, + CategorySeeder::class, + ProductTypeSeeder::class, + AttributeSeeder::class, + SellerDataSeeder::class, + LocationSeeder::class, + LocaleSeeder::class, + ProductSeeder::class, ]); - - $categories = [ - // Create root category first - [ - 'name' => 'Root', - 'description' => 'Root category for all products', - 'is_active' => true, - 'parent_id' => null, - - ], - ]; - - // Create root category first - Category::create($categories[0]); - - // Now create the rest of the categories - $mainCategories = [ - [ - 'name' => 'Electronics', - 'description' => 'Smartphones, laptops, tablets, and other electronic devices', - 'is_active' => true, - 'parent_id' => 1, // References the Root category - - ], - [ - 'name' => 'Home & Kitchen', - 'description' => 'Appliances, kitchenware, furniture, and home décor', - 'is_active' => true, - 'parent_id' => 1, - - ], - [ - 'name' => 'Fashion', - 'description' => 'Clothing, shoes, accessories, and jewelry', - 'is_active' => true, - 'parent_id' => 1, - - ], - [ - 'name' => 'Sports & Outdoors', - 'description' => 'Athletic equipment, camping gear, and outdoor recreation products', - 'is_active' => true, - 'parent_id' => 1, - - ], - [ - 'name' => 'Beauty & Personal Care', - 'description' => 'Cosmetics, skincare, haircare, and personal hygiene products', - 'is_active' => true, - 'parent_id' => 1, - - ], - [ - 'name' => 'Books & Media', - 'description' => 'Books, e-books, movies, music, and educational content', - 'is_active' => true, - 'parent_id' => 1, - - ], - [ - 'name' => 'Toys & Games', - 'description' => 'Children\'s toys, board games, and entertainment items', - 'is_active' => true, - 'parent_id' => 1, - - ], - [ - 'name' => 'Automotive', - 'description' => 'Car parts, accessories, and maintenance products', - 'is_active' => true, - 'parent_id' => 1, - - ], - [ - 'name' => 'Pet Supplies', - 'description' => 'Pet food, accessories, and care products for all types of pets', - 'is_active' => true, - 'parent_id' => 1, - - ], - [ - 'name' => 'Office Supplies', - 'description' => 'Stationery, office furniture, and business essentials', - 'is_active' => true, - 'parent_id' => 1, - - ], - ]; - - foreach ($mainCategories as $category) { - Category::create($category); - } - - $subCategories = [ - // Electronics sub-categories - [ - 'name' => 'Smartphones', - 'description' => 'Mobile phones and accessories', - 'is_active' => true, - 'parent_id' => 2, // Electronics - - ], - [ - 'name' => 'Laptops', - 'description' => 'Notebook computers and accessories', - 'is_active' => true, - 'parent_id' => 2, - - ], - // Home & Kitchen sub-categories - [ - 'name' => 'Cookware', - 'description' => 'Pots, pans and cooking utensils', - 'is_active' => true, - 'parent_id' => 3, - - ], - [ - 'name' => 'Small Appliances', - 'description' => 'Coffee makers, toasters, blenders etc', - 'is_active' => true, - 'parent_id' => 3, - - ], - // Fashion sub-categories - [ - 'name' => 'Women\'s Clothing', - 'description' => 'Dresses, tops, pants and more for women', - 'is_active' => true, - 'parent_id' => 4, - - ], - [ - 'name' => 'Men\'s Clothing', - 'description' => 'Shirts, pants, suits and more for men', - 'is_active' => true, - 'parent_id' => 4, - - ], - ]; - - foreach ($subCategories as $category) { - Category::create($category); - } - - $sellerProducts = [ - [ - 'name' => 'Sony WH-1000XM4 Wireless Headphones', - 'description' => 'Industry-leading noise canceling with Dual Noise Sensor technology', - 'attributes' => [ - 'brand' => 'Sony', - 'color' => ['Black', 'Silver', 'Blue'], - 'battery_life' => '30 hours', - 'connectivity' => 'Bluetooth 5.0' - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Le Creuset Enameled Dutch Oven', - 'description' => 'Premium cast iron cooking pot with superior heat distribution and retention', - 'attributes' => [ - 'material' => 'Enameled Cast Iron', - 'capacity' => '5.5 Qt', - 'colors_available' => ['Flame', 'Marine', 'Cerise'], - 'dishwasher_safe' => true - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Nike Air Zoom Pegasus 38', - 'description' => 'Responsive running shoes with Zoom Air cushioning', - 'attributes' => [ - 'type' => 'Running Shoes', - 'sizes' => ['US 7-13'], - 'colors' => ['Black/White', 'Grey/Volt'], - 'gender' => 'Unisex' - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'DJI Mini 2 Drone', - 'description' => 'Ultralight and foldable drone with 4K camera', - 'attributes' => [ - 'flight_time' => '31 minutes', - 'camera' => '4K', - 'weight' => '249g', - 'range' => '10km' - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Dyson V15 Detect', - 'description' => 'Cordless vacuum with laser dust detection', - 'attributes' => [ - 'runtime' => '60 minutes', - 'bin_capacity' => '0.75L', - 'weight' => '6.8 lbs', - 'features' => ['Laser Detection', 'LCD Screen'] - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'LEGO Star Wars Millennium Falcon', - 'description' => 'Detailed replica of the iconic spacecraft', - 'attributes' => [ - 'pieces' => 7541, - 'age_range' => '16+', - 'dimensions' => '33x22x8 inches', - 'includes_minifigures' => true - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Kindle Paperwhite', - 'description' => 'Waterproof e-reader with 6.8" display and adjustable warm light', - 'attributes' => [ - 'storage' => '8GB', - 'screen_size' => '6.8 inches', - 'waterproof_rating' => 'IPX8', - 'battery_life' => '10 weeks' - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Automatic Pet Feeder', - 'description' => 'Smart pet feeder with programmable meal times', - 'attributes' => [ - 'capacity' => '6L', - 'meal_settings' => '1-4 meals/day', - 'power_source' => ['Battery', 'USB'], - 'app_control' => true - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Herman Miller Aeron Chair', - 'description' => 'Ergonomic office chair with PostureFit SL support', - 'attributes' => [ - 'size_options' => ['A', 'B', 'C'], - 'material' => '8Z Pellicle', - 'warranty' => '12 years', - 'adjustable_features' => ['Height', 'Tilt', 'Arms'] - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'MAC Professional Makeup Kit', - 'description' => 'Complete makeup artist kit with essential products', - 'attributes' => [ - 'includes' => ['Eyeshadows', 'Lipsticks', 'Brushes'], - 'shades' => 48, - 'professional_grade' => true, - 'travel_case' => true - ], - 'category_id' => Category::inRandomOrder()->first()->id, - 'seller_id' => $seller->id, - ], - ]; - - foreach ($sellerProducts as $productData) { - SellerProduct::create($productData); - } - - // Relate some seller products with golden products - $goldenProducts = GoldenProduct::all(); - $sellerProducts = SellerProduct::all(); - - // For each golden product, relate it with 2-3 seller products - foreach ($goldenProducts as $goldenProduct) { - $randomSellerProducts = $sellerProducts->random(rand(2, 3)); - foreach ($randomSellerProducts as $sellerProduct) { - $sellerProduct->update(['golden_product_id' => $goldenProduct->id]); - } - } - - $sellerVariants = [ - // Sony Headphones Variants - [ - 'name' => 'WH-1000XM4 - Midnight Black', - 'description' => 'Classic black colorway with premium finish', - 'sku' => 'SONY-WH4-BLK', - 'attributes' => [ - 'color' => 'Midnight Black', - 'warranty' => '1 year', - 'includes' => ['Carrying Case', 'Audio Cable', 'USB-C Cable'] - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'WH-1000XM4 - Platinum Silver', - 'description' => 'Sleek silver edition with matching accessories', - 'sku' => 'SONY-WH4-SLV', - 'attributes' => [ - 'color' => 'Platinum Silver', - 'warranty' => '1 year', - 'includes' => ['Carrying Case', 'Audio Cable', 'USB-C Cable'] - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // Le Creuset Variants - [ - 'name' => 'Dutch Oven - Flame Orange 5.5Qt', - 'description' => 'Signature flame orange color, 5.5-quart capacity', - 'sku' => 'LC-DO-55-FLM', - 'attributes' => [ - 'color' => 'Flame Orange', - 'size' => '5.5 Qt', - 'material' => 'Enameled Cast Iron' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Dutch Oven - Marine Blue 7.25Qt', - 'description' => 'Deep marine blue color, larger 7.25-quart capacity', - 'sku' => 'LC-DO-72-MRN', - 'attributes' => [ - 'color' => 'Marine Blue', - 'size' => '7.25 Qt', - 'material' => 'Enameled Cast Iron' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // Nike Shoes Variants - [ - 'name' => 'Pegasus 38 - Black/White US 9', - 'description' => 'Classic black and white colorway, size US 9', - 'sku' => 'NK-PG38-BW-09', - 'attributes' => [ - 'color' => 'Black/White', - 'size' => 'US 9', - 'width' => 'Regular' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Pegasus 38 - Grey/Volt US 10', - 'description' => 'Grey with volt accents, size US 10', - 'sku' => 'NK-PG38-GV-10', - 'attributes' => [ - 'color' => 'Grey/Volt', - 'size' => 'US 10', - 'width' => 'Wide' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // Dyson Variants - [ - 'name' => 'V15 Detect - Complete', - 'description' => 'Complete set with all attachments', - 'sku' => 'DYS-V15-CMP', - 'attributes' => [ - 'model' => 'Complete', - 'attachments' => ['All Standard', 'Extra Tools'], - 'warranty' => '2 years' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'V15 Detect - Essential', - 'description' => 'Essential package with standard attachments', - 'sku' => 'DYS-V15-ESS', - 'attributes' => [ - 'model' => 'Essential', - 'attachments' => ['Standard Only'], - 'warranty' => '2 years' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // Kindle Variants - [ - 'name' => 'Paperwhite 8GB - With Ads', - 'description' => 'Standard version with special offers', - 'attributes' => [ - 'storage' => '8GB', - 'special_offers' => true, - 'color' => 'Black' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Paperwhite 16GB - No Ads', - 'description' => 'Extended storage without special offers', - 'attributes' => [ - 'storage' => '16GB', - 'special_offers' => false, - 'color' => 'Black' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // Herman Miller Variants - [ - 'name' => 'Aeron - Size A Graphite', - 'description' => 'Small size in graphite finish', - 'attributes' => [ - 'size' => 'A', - 'color' => 'Graphite', - 'lumbar_support' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Aeron - Size B Mineral', - 'description' => 'Medium size in mineral finish', - 'attributes' => [ - 'size' => 'B', - 'color' => 'Mineral', - 'lumbar_support' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // MAC Makeup Variants - [ - 'name' => 'Pro Kit - Warm Tones', - 'description' => 'Professional kit focused on warm shades', - 'attributes' => [ - 'palette_type' => 'Warm', - 'number_of_shades' => 24, - 'includes_brushes' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Pro Kit - Cool Tones', - 'description' => 'Professional kit focused on cool shades', - 'attributes' => [ - 'palette_type' => 'Cool', - 'number_of_shades' => 24, - 'includes_brushes' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // DJI Drone Variants - [ - 'name' => 'Mini 2 - Standard', - 'description' => 'Standard package with basic accessories', - 'attributes' => [ - 'package_type' => 'Standard', - 'batteries' => 1, - 'carrying_case' => 'Basic' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Mini 2 - Fly More Combo', - 'description' => 'Extended package with additional accessories', - 'attributes' => [ - 'package_type' => 'Fly More', - 'batteries' => 3, - 'carrying_case' => 'Premium' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // Pet Feeder Variants - [ - 'name' => 'Smart Feeder - Standard', - 'description' => 'Basic model with essential features', - 'attributes' => [ - 'capacity' => '4L', - 'wifi_enabled' => false, - 'battery_backup' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Smart Feeder - Premium', - 'description' => 'Advanced model with WiFi connectivity', - 'attributes' => [ - 'capacity' => '6L', - 'wifi_enabled' => true, - 'battery_backup' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // LEGO Variants - [ - 'name' => 'Millennium Falcon - Standard Edition', - 'description' => 'Regular retail version', - 'attributes' => [ - 'edition' => 'Standard', - 'exclusive_minifigures' => false, - 'display_stand' => false - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Millennium Falcon - Collector\'s Edition', - 'description' => 'Limited collector\'s version with extras', - 'attributes' => [ - 'edition' => 'Collector', - 'exclusive_minifigures' => true, - 'display_stand' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - // Additional Generic Variants - [ - 'name' => 'Limited Holiday Edition', - 'description' => 'Special holiday season variant', - 'attributes' => [ - 'edition_type' => 'Limited', - 'season' => 'Holiday 2023', - 'numbered' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Starter Bundle', - 'description' => 'Perfect for beginners', - 'attributes' => [ - 'bundle_type' => 'Starter', - 'includes_guide' => true, - 'bonus_items' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Premium Bundle', - 'description' => 'Complete set with all accessories', - 'attributes' => [ - 'bundle_type' => 'Premium', - 'exclusive_content' => true, - 'extended_warranty' => true - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Professional Edition', - 'description' => 'Enhanced version for professional users', - 'attributes' => [ - 'edition' => 'Professional', - 'pro_features' => true, - 'support_level' => 'Priority' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - [ - 'name' => 'Basic Edition', - 'description' => 'Standard version for regular users', - 'attributes' => [ - 'edition' => 'Basic', - 'pro_features' => false, - 'support_level' => 'Standard' - ], - 'seller_product_id' => SellerProduct::inRandomOrder()->first()->id, - - 'seller_id' => $seller->id, - ], - ]; - - foreach ($sellerVariants as $variant) { - SellerVariant::create($variant); - } - - $locations = [ - [ - 'name' => 'Central Distribution Center', - 'address' => '2250 Parkway Drive, Denver, CO 80216', - 'default_delivery_days' => 2, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'West Coast Fulfillment Center', - 'address' => '1100 Harbor Bay Parkway, Oakland, CA 94502', - 'default_delivery_days' => 3, - 'seller_id' => $seller->id, - ], - [ - 'name' => 'East Coast Warehouse', - 'address' => '200 Liberty Way, Newark, NJ 07114', - 'default_delivery_days' => 2, - 'seller_id' => $seller->id, - ], - ]; - - foreach ($locations as $location) { - Location::create($location); - } - - // Create multiple stock entries for each variant across different locations - $stocks = []; - - // Get all variants and locations to distribute stock across them - $variants = SellerVariant::all(); - $locations = Location::all(); - - // Create stock entries ensuring good distribution - foreach ($variants as $variant) { - // Randomly decide how many locations this variant is stocked in (1-3) - $numberOfLocations = rand(1, 3); - $randomLocations = $locations->random($numberOfLocations); - - foreach ($randomLocations as $location) { - $stocks[] = [ - 'quantity' => rand(50, 500), - 'reserved' => rand(0, 20), - 'safety_stock' => rand(10, 50), - 'seller_variant_id' => $variant->id, - 'seller_product_id' => $variant->sellerProduct->id, - 'location_id' => $location->id, - 'seller_id' => $seller->id, - ]; - } - } - - // Trim to exactly 35 entries if we generated more - $stocks = array_slice($stocks, 0, 35); - - foreach ($stocks as $stock) { - Stock::create($stock); - } - - $currencies = [ - [ - 'code' => 'USD', - 'symbol' => '$', - 'name' => 'US Dollar', - - ], - [ - 'code' => 'EUR', - 'symbol' => '€', - 'name' => 'Euro', - - ], - [ - 'code' => 'GBP', - 'symbol' => '£', - 'name' => 'British Pound Sterling', - - ] - ]; - - foreach ($currencies as $currency) { - Currency::create($currency); - } - - $productTypes = [ - [ - 'name' => 'T-Shirt', - 'attributes' => [ - [ - 'name' => 'Size', - 'type' => 'select', - 'field' => 'Select', - 'description' => 'Standard t-shirt size using international sizing system (XS to XL)', - 'is_variant_attribute' => true, - 'is_translatable' => false, - 'rank' => 1, - 'options' => [ - ['label' => 'Extra Small', 'value' => 'XS'], - ['label' => 'Small', 'value' => 'S'], - ['label' => 'Medium', 'value' => 'M'], - ['label' => 'Large', 'value' => 'L'], - ['label' => 'Extra Large', 'value' => 'XL'], - ], - ], - [ - 'name' => 'Color', - 'type' => 'select', - 'field' => 'ColorPicker', - 'description' => 'Main color of the t-shirt. For multi-colored shirts, choose the dominant color', - 'is_variant_attribute' => true, - 'is_translatable' => false, - 'rank' => 2, - ], - [ - 'name' => 'Material', - 'type' => 'text', - 'field' => 'TextInput', - 'description' => 'Fabric composition (e.g., "100% Cotton" or "95% Cotton, 5% Elastane")', - 'is_variant_attribute' => false, - 'is_translatable' => true, - 'rank' => 3, - 'unit' => '%', - 'validators' => [ - 'max_length' => 100, - ], - ], - ], - ], - [ - 'name' => 'Jeans', - 'attributes' => [ - [ - 'name' => 'Waist Size', - 'type' => 'number', - 'field' => 'TextInput', - 'description' => 'Waist measurement in inches. Measure around the natural waistline', - 'is_variant_attribute' => true, - 'is_translatable' => false, - 'rank' => 1, - 'unit' => 'inch', - 'validators' => [ - 'min' => 24, - 'max' => 48, - ], - ], - [ - 'name' => 'Length', - 'type' => 'number', - 'field' => 'TextInput', - 'description' => 'Inseam length in inches, measured from crotch to hem', - 'is_variant_attribute' => true, - 'is_translatable' => false, - 'rank' => 2, - 'unit' => 'inch', - 'validators' => [ - 'min' => 26, - 'max' => 36, - ], - ], - [ - 'name' => 'Style', - 'type' => 'select', - 'field' => 'Select', - 'description' => 'Cut and fit style of the jeans, affecting how they shape to the body', - 'is_variant_attribute' => true, - 'is_translatable' => true, - 'rank' => 3, - 'options' => [ - ['label' => 'Skinny', 'value' => 'skinny'], - ['label' => 'Slim', 'value' => 'slim'], - ['label' => 'Regular', 'value' => 'regular'], - ['label' => 'Relaxed', 'value' => 'relaxed'], - ['label' => 'Boot Cut', 'value' => 'boot_cut'], - ], - ], - ], - ], - [ - 'name' => 'Dress', - 'attributes' => [ - [ - 'name' => 'Size', - 'type' => 'select', - 'field' => 'Select', - 'description' => 'Standard dress size using international sizing system (XS to XL)', - 'is_variant_attribute' => true, - 'is_translatable' => false, - 'rank' => 1, - 'options' => [ - ['label' => 'Extra Small', 'value' => 'XS'], - ['label' => 'Small', 'value' => 'S'], - ['label' => 'Medium', 'value' => 'M'], - ['label' => 'Large', 'value' => 'L'], - ['label' => 'Extra Large', 'value' => 'XL'], - ], - ], - [ - 'name' => 'Length', - 'type' => 'select', - 'field' => 'Select', - 'description' => 'Overall length of the dress, measured from shoulder to hem', - 'is_variant_attribute' => false, - 'is_translatable' => true, - 'rank' => 2, - 'options' => [ - ['label' => 'Mini', 'value' => 'mini'], - ['label' => 'Knee Length', 'value' => 'knee'], - ['label' => 'Midi', 'value' => 'midi'], - ['label' => 'Maxi', 'value' => 'maxi'], - ], - ], - ], - ], - [ - 'name' => 'Shoes', - 'attributes' => [ - [ - 'name' => 'Size', - 'type' => 'number', - 'field' => 'TextInput', - 'description' => 'European shoe size. For half sizes, round up to the nearest whole number', - 'is_variant_attribute' => true, - 'is_translatable' => false, - 'rank' => 1, - 'unit' => 'EU', - 'validators' => [ - 'min' => 35, - 'max' => 47, - 'decimal_places' => 0, - ], - ], - [ - 'name' => 'Color', - 'type' => 'select', - 'field' => 'ColorPicker', - 'description' => 'Primary color of the shoes. For multi-colored shoes, select the dominant color', - 'is_variant_attribute' => true, - 'is_translatable' => false, - 'rank' => 2, - ], - [ - 'name' => 'Material', - 'type' => 'select', - 'field' => 'Select', - 'description' => 'Primary material used in the shoe construction', - 'is_variant_attribute' => false, - 'is_translatable' => true, - 'rank' => 3, - 'options' => [ - ['label' => 'Leather', 'value' => 'leather'], - ['label' => 'Suede', 'value' => 'suede'], - ['label' => 'Canvas', 'value' => 'canvas'], - ['label' => 'Synthetic', 'value' => 'synthetic'], - ], - ], - ], - ], - [ - 'name' => 'Bag', - 'attributes' => [ - [ - 'name' => 'Size', - 'type' => 'select', - 'field' => 'Select', - 'description' => 'General size category of the bag, based on carrying capacity and dimensions', - 'is_variant_attribute' => false, - 'is_translatable' => false, - 'rank' => 1, - 'options' => [ - ['label' => 'Small', 'value' => 'small'], - ['label' => 'Medium', 'value' => 'medium'], - ['label' => 'Large', 'value' => 'large'], - ], - ], - [ - 'name' => 'Color', - 'type' => 'select', - 'field' => 'ColorPicker', - 'description' => 'Main color of the bag. For multi-colored bags, choose the predominant color', - 'is_variant_attribute' => true, - 'is_translatable' => false, - 'rank' => 2, - ], - [ - 'name' => 'Material', - 'type' => 'select', - 'field' => 'Select', - 'description' => 'Primary material used in the bag construction. Affects durability and care instructions', - 'is_variant_attribute' => false, - 'is_translatable' => true, - 'rank' => 3, - 'options' => [ - ['label' => 'Leather', 'value' => 'leather'], - ['label' => 'Canvas', 'value' => 'canvas'], - ['label' => 'Nylon', 'value' => 'nylon'], - ['label' => 'Synthetic', 'value' => 'synthetic'], - ], - ], - ], - ], - ]; - - foreach ($productTypes as $productTypeData) { - $attributes = $productTypeData['attributes']; - unset($productTypeData['attributes']); - - $productType = \App\Models\ProductType::create($productTypeData); - - foreach ($attributes as $attributeData) { - $productType->attributes()->create($attributeData); - } - } - - // Create locales - DB::table('locales')->insert([ - [ - 'code' => 'en-US', - 'name' => 'English (US)', - 'default' => true, - ], - [ - 'code' => 'fr-FR', - 'name' => 'French', - 'default' => false, - ], - [ - 'code' => 'de-DE', - 'name' => 'German', - 'default' => false, - ], - ]); - - // Get all variants and currencies - $variants = SellerVariant::all(); - $currencies = Currency::all(); - - // Create a price for each variant in each currency - foreach ($variants as $variant) { - // Base price in USD (between $10 and $2000) - $basePrice = rand(1000, 200000); // in cents - - foreach ($currencies as $currency) { - // Apply conversion rates (approximate) - $value = match ($currency->code) { - 'USD' => $basePrice, - 'EUR' => (int)($basePrice * 0.93), // USD to EUR - 'GBP' => (int)($basePrice * 0.79), // USD to GBP - default => $basePrice - }; - - // Set USD as default currency - if ($currency->code === 'USD') { - $currency->is_default = true; - $currency->save(); - } - - $price = new Price([ - 'amount' => $value, - 'seller_variant_id' => $variant->id, - 'seller_product_id' => $variant->sellerProduct->id, - 'currency_id' => $currency->id - ]); - $price->save(); - } - } - - // Create Golden Products - $goldenProducts = [ - [ - 'product_type_id' => ProductType::where('name', 'Jeans')->first()->id, - 'translations' => [ - [ - 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, - 'name' => 'Classic Comfort Jeans', - 'description' => 'Premium denim jeans with a comfortable regular fit. Perfect for everyday wear.', - 'attributes' => [ - 'Style' => 'regular', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, - 'name' => 'Jean Confort Classique', - 'description' => 'Jean en denim premium avec une coupe régulière confortable. Parfait pour un usage quotidien.', - 'attributes' => [ - 'Style' => 'regular', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, - 'name' => 'Klassische Komfort-Jeans', - 'description' => 'Premium-Denim-Jeans mit bequemer regulärer Passform. Perfekt für den Alltag.', - 'attributes' => [ - 'Style' => 'regular', - ], - ], - ], - ], - [ - 'product_type_id' => ProductType::where('name', 'Dress')->first()->id, - 'translations' => [ - [ - 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, - 'name' => 'Elegant Evening Dress', - 'description' => 'A stunning midi dress perfect for special occasions and evening events.', - 'attributes' => [ - 'Length' => 'midi', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, - 'name' => 'Robe de Soirée Élégante', - 'description' => 'Une superbe robe midi parfaite pour les occasions spéciales et les soirées.', - 'attributes' => [ - 'Length' => 'midi', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, - 'name' => 'Elegantes Abendkleid', - 'description' => 'Ein atemberaubendes Midi-Kleid, perfekt für besondere Anlässe und Abendveranstaltungen.', - 'attributes' => [ - 'Length' => 'midi', - ], - ], - ], - ], - [ - 'product_type_id' => ProductType::where('name', 'Shoes')->first()->id, - 'translations' => [ - [ - 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, - 'name' => 'Classic Leather Oxford', - 'description' => 'Timeless leather oxford shoes crafted with premium materials and expert craftsmanship.', - 'attributes' => [ - 'Material' => 'leather', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, - 'name' => 'Oxford en Cuir Classique', - 'description' => 'Chaussures oxford intemporelles en cuir fabriquées avec des matériaux premium et un savoir-faire expert.', - 'attributes' => [ - 'Material' => 'leather', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, - 'name' => 'Klassischer Leder-Oxford', - 'description' => 'Zeitlose Leder-Oxford-Schuhe, gefertigt aus Premium-Materialien mit expertenhafter Handwerkskunst.', - 'attributes' => [ - 'Material' => 'leather', - ], - ], - ], - ], - [ - 'product_type_id' => ProductType::where('name', 'Bag')->first()->id, - 'translations' => [ - [ - 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, - 'name' => 'Premium Leather Tote', - 'description' => 'Spacious leather tote bag with premium finishes and durable construction.', - 'attributes' => [ - 'Size' => 'large', - 'Material' => 'leather', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, - 'name' => 'Cabas en Cuir Premium', - 'description' => 'Grand sac cabas en cuir avec finitions premium et construction durable.', - 'attributes' => [ - 'Size' => 'large', - 'Material' => 'leather', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, - 'name' => 'Premium Leder-Shopper', - 'description' => 'Geräumige Ledertasche mit Premium-Verarbeitung und langlebiger Konstruktion.', - 'attributes' => [ - 'Size' => 'large', - 'Material' => 'leather', - ], - ], - ], - ], - ]; - - foreach ($goldenProducts as $productData) { - $translations = $productData['translations']; - unset($productData['translations']); - - $goldenProduct = \App\Models\GoldenProduct::create($productData); - - foreach ($translations as $translationData) { - $translationData['product_type_id'] = $productData['product_type_id']; - $goldenProduct->translations()->create($translationData); - } - - // Create variants for each golden product - $variantData = [ - [ - 'translations' => [ - [ - 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, - 'name' => 'Large Size', - 'description' => 'Large size variant of the product', - 'attributes' => [ - 'Size' => 'large', - 'Material' => 'premium', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, - 'name' => 'Grande Taille', - 'description' => 'Variante de grande taille du produit', - 'attributes' => [ - 'Size' => 'large', - 'Material' => 'premium', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, - 'name' => 'Große Größe', - 'description' => 'Große Variante des Produkts', - 'attributes' => [ - 'Size' => 'large', - 'Material' => 'premium', - ], - ], - ], - ], - [ - 'translations' => [ - [ - 'locale_id' => DB::table('locales')->where('code', 'en-US')->first()->id, - 'name' => 'Medium Size', - 'description' => 'Medium size variant of the product', - 'attributes' => [ - 'Size' => 'medium', - 'Material' => 'standard', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'fr-FR')->first()->id, - 'name' => 'Taille Moyenne', - 'description' => 'Variante de taille moyenne du produit', - 'attributes' => [ - 'Size' => 'medium', - 'Material' => 'standard', - ], - ], - [ - 'locale_id' => DB::table('locales')->where('code', 'de-DE')->first()->id, - 'name' => 'Mittlere Größe', - 'description' => 'Mittlere Variante des Produkts', - 'attributes' => [ - 'Size' => 'medium', - 'Material' => 'standard', - ], - ], - ], - ], - ]; - - // Create variants for this golden product - foreach ($variantData as $variant) { - $translations = $variant['translations']; - - // Create the variant - $goldenProductVariant = $goldenProduct->variants()->create([ - 'golden_product_id' => $goldenProduct->id, - ]); - - // Create translations for the variant - foreach ($translations as $translationData) { - $goldenProductVariant->translations()->create($translationData); - } - } - } } } diff --git a/database/seeders/LocaleSeeder.php b/database/seeders/LocaleSeeder.php new file mode 100644 index 0000000..dbddb65 --- /dev/null +++ b/database/seeders/LocaleSeeder.php @@ -0,0 +1,34 @@ + 'en', + 'name' => 'English', + 'default' => true, + ], + [ + 'code' => 'de', + 'name' => 'German', + 'default' => false, + ], + [ + 'code' => 'fr', + 'name' => 'French', + 'default' => false, + ], + ]; + + foreach ($locales as $locale) { + Locale::create($locale); + } + } +} diff --git a/database/seeders/LocationSeeder.php b/database/seeders/LocationSeeder.php new file mode 100644 index 0000000..75644f6 --- /dev/null +++ b/database/seeders/LocationSeeder.php @@ -0,0 +1,48 @@ + $seller->id, + 'name' => 'Main Warehouse', + 'address' => '789 Warehouse Ave, Unit 101, San Francisco, CA 94107', + 'default_delivery_days' => 3, + ]); + + // Create additional locations + $locations = [ + [ + 'name' => 'Central Distribution Center', + 'address' => '2250 Parkway Drive, Denver, CO 80216', + 'default_delivery_days' => 2, + 'seller_id' => $seller->id, + ], + [ + 'name' => 'West Coast Fulfillment Center', + 'address' => '1100 Harbor Bay Parkway, Oakland, CA 94502', + 'default_delivery_days' => 3, + 'seller_id' => $seller->id, + ], + [ + 'name' => 'East Coast Warehouse', + 'address' => '200 Liberty Way, Newark, NJ 07114', + 'default_delivery_days' => 2, + 'seller_id' => $seller->id, + ], + ]; + + foreach ($locations as $locationData) { + Location::create($locationData); + } + } +} diff --git a/database/seeders/ProductSeeder.php b/database/seeders/ProductSeeder.php new file mode 100644 index 0000000..0137eec --- /dev/null +++ b/database/seeders/ProductSeeder.php @@ -0,0 +1,201 @@ + 'Nike Air Max 270', + 'description' => 'Revolutionary Air technology meets modern comfort. The Nike Air Max 270 features the first-ever Max Air unit designed specifically for Nike Sportswear.', + 'brand' => 'Nike', + 'type' => 'Sneakers', + 'attributes' => [ + 'Material' => 'Engineered mesh upper with synthetic overlays', + 'Sole Type' => 'Max Air cushioning', + 'Closure Type' => 'Lace-up', + 'Style' => 'Athletic', + 'Season' => 'All-season', + 'Water Resistant' => 'No', + 'Collection' => 'Air Max', + 'Target Gender' => 'Unisex' + ], + 'variant_attributes' => [ + ['size' => '42', 'color' => 'Black'], + ['size' => '43', 'color' => 'Black'], + ['size' => '44', 'color' => 'Black'], + ['size' => '42', 'color' => 'White'], + ['size' => '43', 'color' => 'White'], + ['size' => '44', 'color' => 'White'], + ['size' => '42', 'color' => 'Red'], + ['size' => '43', 'color' => 'Red'] + ], + 'base_price' => 169.99, + 'image' => $faker->imageUrl(640, 480, 'sneakers', true) + ], + [ + 'name' => 'Premium Cotton Crew Neck', + 'description' => 'Ultra-soft 100% organic cotton t-shirt with a modern fit. Pre-shrunk fabric ensures lasting comfort and shape retention.', + 'brand' => 'Organic Basics', + 'type' => 'T-Shirt', + 'attributes' => [ + 'Material' => '100% organic cotton', + 'Weight' => '180 GSM', + 'Fit Type' => 'Regular fit', + 'Neckline' => 'Crew neck', + 'Care Instructions' => 'Machine wash cold, tumble dry low', + 'Sustainability' => 'Organic certified', + 'Origin' => 'Made in Portugal', + 'Sleeve Type' => 'Short sleeve' + ], + 'variant_attributes' => [ + ['size' => 'M', 'color' => 'Black'], + ['size' => 'L', 'color' => 'Black'], + ['size' => 'XL', 'color' => 'Black'], + ['size' => 'M', 'color' => 'White'], + ['size' => 'L', 'color' => 'White'], + ['size' => 'XL', 'color' => 'White'], + ['size' => 'M', 'color' => 'Navy'], + ['size' => 'L', 'color' => 'Navy'] + ], + 'base_price' => 39.99, + 'image' => $faker->imageUrl(640, 480, 'tshirt', true) + ], + [ + 'name' => 'Levi\'s 501 Original', + 'description' => 'The original straight fit jean that started it all. The 501® Original Fit Jeans are a cultural icon, featuring the signature button fly and straight leg fit.', + 'brand' => 'Levi\'s', + 'type' => 'Jeans', + 'attributes' => [ + 'Material' => '100% cotton denim', + 'Rise' => 'Mid rise', + 'Fit Type' => 'Straight fit', + 'Closure Type' => 'Button fly', + 'Care Instructions' => 'Machine wash cold, inside out', + 'Origin' => 'Made in USA', + 'Stretch' => 'Non-stretch', + 'Pocket Style' => '5-pocket styling' + ], + 'variant_attributes' => [ + ['size' => '32/32', 'wash' => 'Dark'], + ['size' => '33/32', 'wash' => 'Dark'], + ['size' => '34/32', 'wash' => 'Dark'], + ['size' => '32/32', 'wash' => 'Medium'], + ['size' => '33/32', 'wash' => 'Medium'], + ['size' => '34/32', 'wash' => 'Medium'], + ['size' => '32/32', 'wash' => 'Light'], + ['size' => '33/32', 'wash' => 'Light'] + ], + 'base_price' => 98.99, + 'image' => $faker->imageUrl(640, 480, 'jeans', true) + ], + [ + 'name' => 'Silk Evening Gown', + 'description' => 'Elegant floor-length evening dress in pure silk. Features a flattering A-line silhouette, subtle side slit, and delicate beading at the neckline.', + 'brand' => 'Elegance', + 'type' => 'Dress', + 'attributes' => [ + 'Material' => '100% pure silk', + 'Style' => 'A-line', + 'Length' => 'Floor length', + 'Occasion' => 'Evening wear', + 'Features' => 'Beaded neckline, side slit', + 'Care Instructions' => 'Dry clean only', + 'Lining' => 'Full silk lining', + 'Closure' => 'Hidden back zipper' + ], + 'variant_attributes' => [ + ['size' => 'S', 'color' => 'Black'], + ['size' => 'M', 'color' => 'Black'], + ['size' => 'L', 'color' => 'Black'], + ['size' => 'S', 'color' => 'Navy'], + ['size' => 'M', 'color' => 'Navy'], + ['size' => 'L', 'color' => 'Navy'], + ['size' => 'S', 'color' => 'Red'], + ['size' => 'M', 'color' => 'Red'] + ], + 'base_price' => 299.99, + 'image' => $faker->imageUrl(640, 480, 'dress', true) + ] + ]; + + // Get all currencies + $currencies = Currency::all(); + $conversionRates = [ + 'USD' => 1.0, + 'EUR' => 0.93, + 'GBP' => 0.79 + ]; + + foreach ($products as $productData) { + $type = $productData['type']; + $variantAttributes = $productData['variant_attributes']; + $attributes = $productData['attributes']; + $basePrice = $productData['base_price']; + $image = $productData['image']; + + unset( + $productData['type'], + $productData['variant_attributes'], + $productData['attributes'], + $productData['base_price'], + $productData['image'] + ); + + $productType = ProductType::where('name', $type)->first(); + + $sellerProduct = SellerProduct::create([ + ...$productData, + 'seller_id' => $seller->id, + 'attributes' => $attributes + ]); + + // Create variants with their attributes + foreach ($variantAttributes as $index => $attributeValues) { + $sku = strtoupper(substr($productData['brand'], 0, 3) . '-' . + implode('-', array_values($attributeValues)) . + '-' . str_pad($index + 1, 3, '0', STR_PAD_LEFT)); + + $variant = $sellerProduct->sellerVariants()->create([ + 'sku' => $sku, + 'attributes' => $attributeValues, + 'seller_id' => $seller->id + ]); + + // Create prices in different currencies + foreach ($currencies as $currency) { + $amount = (int) ($basePrice * $conversionRates[$currency->code] * 100); // Convert to cents + $variant->prices()->create([ + 'amount' => $amount, + 'currency_id' => $currency->id, + 'seller_product_id' => $sellerProduct->id + ]); + } + + // Create stock + $variant->stocks()->create([ + 'quantity' => rand(10, 100), + 'seller_product_id' => $sellerProduct->id, + 'seller_id' => $seller->id, + 'location_id' => $location->id, + 'safety_stock' => rand(5, 15), + 'reserved' => 0 + ]); + } + } + } +} diff --git a/database/seeders/ProductTypeSeeder.php b/database/seeders/ProductTypeSeeder.php new file mode 100644 index 0000000..d564b18 --- /dev/null +++ b/database/seeders/ProductTypeSeeder.php @@ -0,0 +1,23 @@ + $type]); + } + } +} diff --git a/database/seeders/SellerDataSeeder.php b/database/seeders/SellerDataSeeder.php new file mode 100644 index 0000000..2441554 --- /dev/null +++ b/database/seeders/SellerDataSeeder.php @@ -0,0 +1,34 @@ + $seller->id, + 'description' => 'BarSeller Inc. is a company that sells fashion products.', + 'company_name' => 'BarSeller Inc.', + 'address_line1' => '123 Market Street', + 'address_line2' => 'Suite 456', + 'city' => 'San Francisco', + 'state' => 'CA', + 'postal_code' => '94105', + 'country_code' => 'US', + 'phone' => '+1-415-555-0123', + 'vat' => 'US123456789', + 'tin' => '12-3456789', + 'eori' => 'US12345678901234', + 'iban' => 'US123456789012345678901234', + 'swift_bic' => 'CHASUS33XXX', + 'bank_name' => 'Chase Bank' + ]); + } +} diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..f666ba6 --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,64 @@ +create([ + 'name' => 'Mr Operator', + 'email' => 'owner@ossc.tech', + 'password' => bcrypt('owner@ossc.tech'), + 'is_seller' => false, + ]); + + $sellerUser = User::factory()->create([ + 'name' => 'Mr Seller', + 'email' => 'seller@ossc.tech', + 'password' => bcrypt('seller@ossc.tech'), + 'is_seller' => true, + ]); + + // Create seller and associate with user + $seller = Seller::create([ + 'name' => 'BarSeller' + ]); + + $sellerUser->sellers()->attach($seller); + + // Create partnership + Partnership::create([ + 'seller_id' => $seller->id, + 'status' => 'submitted', + 'notes' => 'Initial partnership application' + ]); + + // Create seller data + SellerData::create([ + 'seller_id' => $seller->id, + 'description' => 'BarSeller Inc. is a company that sells wooden furniture.', + 'company_name' => 'BarSeller Inc.', + 'address_line1' => '123 Market Street', + 'address_line2' => 'Suite 456', + 'city' => 'San Francisco', + 'state' => 'CA', + 'postal_code' => '94105', + 'country_code' => 'US', + 'phone' => '+1-415-555-0123', + 'vat' => 'US123456789', + 'tin' => '12-3456789', + 'eori' => 'US12345678901234', + 'iban' => 'US123456789012345678901234', + 'swift_bic' => 'CHASUS33XXX', + 'bank_name' => 'Chase Bank' + ]); + } +} diff --git a/draft.yaml b/draft.yaml index af2369c..1488c5d 100644 --- a/draft.yaml +++ b/draft.yaml @@ -146,7 +146,6 @@ models: name: string description: text nullable attributes: json nullable - product_type_id: id foreign locale_id: id foreign golden_product_id: id foreign From 83f93a9620db4a5814790e4287b83f44bda191ac Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 4 Dec 2024 18:30:11 +0100 Subject: [PATCH 14/19] ... --- .blueprint | 40 +++---- .../Owner/Resources/GoldenProductResource.php | 15 ++- app/Services/GoldenProductService.php | 85 ++++++++++++-- ...024_12_04_172849_create_sellers_table.php} | 0 ...2_04_172850_create_partnerships_table.php} | 0 ...12_04_172851_create_seller_data_table.php} | 0 ..._12_04_172852_create_categories_table.php} | 0 ...4_172853_create_seller_products_table.php} | 0 ...54_create_seller_product_images_table.php} | 0 ...4_172855_create_seller_variants_table.php} | 0 ...2024_12_04_172856_create_prices_table.php} | 0 ...2024_12_04_172857_create_stocks_table.php} | 0 ...4_12_04_172858_create_locations_table.php} | 0 ..._12_04_172859_create_currencies_table.php} | 0 ...24_12_04_172900_create_messages_table.php} | 0 ..._04_172901_create_product_types_table.php} | 0 ..._create_product_type_attributes_table.php} | 0 ...4_172903_create_golden_products_table.php} | 0 ...reate_golden_product_localizeds_table.php} | 0 ..._create_golden_product_variants_table.php} | 0 ...lden_product_variant_localizeds_table.php} | 0 ...024_12_04_172907_create_locales_table.php} | 0 ...12_04_172908_create_seller_user_table.php} | 0 database/seeders/AttributeSeeder.php | 107 ++++++++++++++---- 24 files changed, 192 insertions(+), 55 deletions(-) rename database/migrations/{2024_12_04_163110_create_sellers_table.php => 2024_12_04_172849_create_sellers_table.php} (100%) rename database/migrations/{2024_12_04_163111_create_partnerships_table.php => 2024_12_04_172850_create_partnerships_table.php} (100%) rename database/migrations/{2024_12_04_163112_create_seller_data_table.php => 2024_12_04_172851_create_seller_data_table.php} (100%) rename database/migrations/{2024_12_04_163113_create_categories_table.php => 2024_12_04_172852_create_categories_table.php} (100%) rename database/migrations/{2024_12_04_163114_create_seller_products_table.php => 2024_12_04_172853_create_seller_products_table.php} (100%) rename database/migrations/{2024_12_04_163115_create_seller_product_images_table.php => 2024_12_04_172854_create_seller_product_images_table.php} (100%) rename database/migrations/{2024_12_04_163116_create_seller_variants_table.php => 2024_12_04_172855_create_seller_variants_table.php} (100%) rename database/migrations/{2024_12_04_163117_create_prices_table.php => 2024_12_04_172856_create_prices_table.php} (100%) rename database/migrations/{2024_12_04_163118_create_stocks_table.php => 2024_12_04_172857_create_stocks_table.php} (100%) rename database/migrations/{2024_12_04_163119_create_locations_table.php => 2024_12_04_172858_create_locations_table.php} (100%) rename database/migrations/{2024_12_04_163120_create_currencies_table.php => 2024_12_04_172859_create_currencies_table.php} (100%) rename database/migrations/{2024_12_04_163121_create_messages_table.php => 2024_12_04_172900_create_messages_table.php} (100%) rename database/migrations/{2024_12_04_163122_create_product_types_table.php => 2024_12_04_172901_create_product_types_table.php} (100%) rename database/migrations/{2024_12_04_163123_create_product_type_attributes_table.php => 2024_12_04_172902_create_product_type_attributes_table.php} (100%) rename database/migrations/{2024_12_04_163124_create_golden_products_table.php => 2024_12_04_172903_create_golden_products_table.php} (100%) rename database/migrations/{2024_12_04_163125_create_golden_product_localizeds_table.php => 2024_12_04_172904_create_golden_product_localizeds_table.php} (100%) rename database/migrations/{2024_12_04_163126_create_golden_product_variants_table.php => 2024_12_04_172905_create_golden_product_variants_table.php} (100%) rename database/migrations/{2024_12_04_163127_create_golden_product_variant_localizeds_table.php => 2024_12_04_172906_create_golden_product_variant_localizeds_table.php} (100%) rename database/migrations/{2024_12_04_163128_create_locales_table.php => 2024_12_04_172907_create_locales_table.php} (100%) rename database/migrations/{2024_12_04_163129_create_seller_user_table.php => 2024_12_04_172908_create_seller_user_table.php} (100%) diff --git a/.blueprint b/.blueprint index fdf59f4..55a4656 100644 --- a/.blueprint +++ b/.blueprint @@ -18,26 +18,26 @@ created: - database/factories/GoldenProductVariantFactory.php - database/factories/GoldenProductVariantLocalizedFactory.php - database/factories/LocaleFactory.php - - database/migrations/2024_12_04_163110_create_sellers_table.php - - database/migrations/2024_12_04_163111_create_partnerships_table.php - - database/migrations/2024_12_04_163112_create_seller_data_table.php - - database/migrations/2024_12_04_163113_create_categories_table.php - - database/migrations/2024_12_04_163114_create_seller_products_table.php - - database/migrations/2024_12_04_163115_create_seller_product_images_table.php - - database/migrations/2024_12_04_163116_create_seller_variants_table.php - - database/migrations/2024_12_04_163117_create_prices_table.php - - database/migrations/2024_12_04_163118_create_stocks_table.php - - database/migrations/2024_12_04_163119_create_locations_table.php - - database/migrations/2024_12_04_163120_create_currencies_table.php - - database/migrations/2024_12_04_163121_create_messages_table.php - - database/migrations/2024_12_04_163122_create_product_types_table.php - - database/migrations/2024_12_04_163123_create_product_type_attributes_table.php - - database/migrations/2024_12_04_163124_create_golden_products_table.php - - database/migrations/2024_12_04_163125_create_golden_product_localizeds_table.php - - database/migrations/2024_12_04_163126_create_golden_product_variants_table.php - - database/migrations/2024_12_04_163127_create_golden_product_variant_localizeds_table.php - - database/migrations/2024_12_04_163128_create_locales_table.php - - database/migrations/2024_12_04_163129_create_seller_user_table.php + - database/migrations/2024_12_04_172849_create_sellers_table.php + - database/migrations/2024_12_04_172850_create_partnerships_table.php + - database/migrations/2024_12_04_172851_create_seller_data_table.php + - database/migrations/2024_12_04_172852_create_categories_table.php + - database/migrations/2024_12_04_172853_create_seller_products_table.php + - database/migrations/2024_12_04_172854_create_seller_product_images_table.php + - database/migrations/2024_12_04_172855_create_seller_variants_table.php + - database/migrations/2024_12_04_172856_create_prices_table.php + - database/migrations/2024_12_04_172857_create_stocks_table.php + - database/migrations/2024_12_04_172858_create_locations_table.php + - database/migrations/2024_12_04_172859_create_currencies_table.php + - database/migrations/2024_12_04_172900_create_messages_table.php + - database/migrations/2024_12_04_172901_create_product_types_table.php + - database/migrations/2024_12_04_172902_create_product_type_attributes_table.php + - database/migrations/2024_12_04_172903_create_golden_products_table.php + - database/migrations/2024_12_04_172904_create_golden_product_localizeds_table.php + - database/migrations/2024_12_04_172905_create_golden_product_variants_table.php + - database/migrations/2024_12_04_172906_create_golden_product_variant_localizeds_table.php + - database/migrations/2024_12_04_172907_create_locales_table.php + - database/migrations/2024_12_04_172908_create_seller_user_table.php - app/Models/Seller.php - app/Models/Partnership.php - app/Models/SellerData.php diff --git a/app/Filament/Owner/Resources/GoldenProductResource.php b/app/Filament/Owner/Resources/GoldenProductResource.php index 8da90f0..edc00fb 100644 --- a/app/Filament/Owner/Resources/GoldenProductResource.php +++ b/app/Filament/Owner/Resources/GoldenProductResource.php @@ -142,10 +142,10 @@ public static function form(Form $form): Form ->required(), ]), - // Section::make('Attributes') - // ->schema(fn(Get $get): array => static::getAttributeFields($get('product_type_id'))) - // ->columns(2) - // ->visible(fn(Get $get): bool => (bool) $get('product_type_id')), + Section::make('Attributes') + ->schema(fn(Get $get): array => static::getAttributeFields($get('product_type_id'))) + ->columns(2) + ->visible(fn(Get $get): bool => (bool) $get('product_type_id')), ]); } @@ -167,7 +167,12 @@ protected static function getAttributeFields(?string $productTypeId): array 'Select' => Forms\Components\Select::make("attributes.{$attribute->name}") ->label($attribute->name) - ->options(collect($attribute->options)->pluck('value', 'value')->toArray()) + ->options(function () use ($attribute) { + // Handle options as a simple array of values + return collect($attribute->options)->mapWithKeys(function ($option) { + return [$option => $option]; + })->toArray(); + }) ->helperText($attribute->description) ->native(false) ->required($attribute->required), diff --git a/app/Services/GoldenProductService.php b/app/Services/GoldenProductService.php index 99b3368..67edb88 100644 --- a/app/Services/GoldenProductService.php +++ b/app/Services/GoldenProductService.php @@ -7,6 +7,7 @@ use App\Models\ProductType; use App\Models\Locale; use App\Services\OpenAIService; +use Illuminate\Support\Facades\Log; class GoldenProductService { @@ -24,6 +25,7 @@ public function createFromSellerProduct(SellerProduct $sellerProduct): GoldenPro } $productTypeId = $this->determineProductType($sellerProduct); + $productType = ProductType::with('attributes')->find($productTypeId); // TODO handle the case when the product type is not found @@ -31,24 +33,27 @@ public function createFromSellerProduct(SellerProduct $sellerProduct): GoldenPro 'product_type_id' => $productTypeId, ]); - // Create translations with attributes for each locale + // Create translations with mapped attributes for each locale foreach (Locale::all() as $locale) { $translatedName = $this->translateProductData($sellerProduct->name, $locale->code); $translatedDescription = $this->translateProductData($sellerProduct->description, $locale->code); - // Translate attributes if they exist - $translatedAttributes = null; + // Map and translate attributes if they exist + $mappedAttributes = null; if ($sellerProduct->attributes) { - $translatedAttributes = json_decode($this->translateProductData( - json_encode($sellerProduct->attributes), - $locale->code - ), true); + $mappedAttributes = $this->mapAttributes($sellerProduct->attributes, $productType); + if ($locale->code !== 'en') { + $mappedAttributes = json_decode($this->translateProductData( + json_encode($mappedAttributes), + $locale->code + ), true); + } } $goldenProduct->translations()->create([ 'name' => $translatedName, 'description' => $translatedDescription, - 'attributes' => $translatedAttributes, + 'attributes' => $mappedAttributes, 'locale_id' => $locale->id, ]); } @@ -58,6 +63,68 @@ public function createFromSellerProduct(SellerProduct $sellerProduct): GoldenPro return $goldenProduct; } + private function mapAttributes(array $sellerAttributes, ProductType $productType): array + { + $client = $this->openAIService->getClient(); + + // Get the schema of valid attributes from the product type + $attributeSchema = $productType->attributes->map(function ($attr) { + return [ + 'name' => $attr->name, + 'type' => $attr->type, + 'description' => $attr->description, + 'unit' => $attr->unit, + 'options' => $attr->options, + 'is_variant_attribute' => $attr->is_variant_attribute, + ]; + })->toArray(); + + // Log input data for debugging + Log::info('Mapping attributes', [ + 'seller_attributes' => $sellerAttributes, + 'schema' => $attributeSchema + ]); + + $response = $client->chat()->create([ + 'model' => $this->openAIService->getSmallModel(), + 'messages' => [ + [ + 'role' => 'system', + 'content' => "Map the seller's attributes to the product type schema, following these rules: + 1. Match attributes based on semantic similarity and field type compatibility + 2. Convert values to match the required type (text, boolean, number, select, url, color) + 3. Ensure select values match the available options + 4. Return a valid JSON object in the format: { schemaFieldName: convertedValue }" + ], + [ + 'role' => 'user', + 'content' => "Please provide a JSON object mapping these seller attributes to the schema: + + Seller Attributes: " . json_encode($sellerAttributes) . " + + Schema: " . json_encode($attributeSchema) + ] + ], + 'response_format' => ['type' => 'json_object'], + 'temperature' => 0.2 + ]); + + // Log the raw response for debugging + Log::info('OpenAI Response', [ + 'response' => $response + ]); + + $content = $response->choices[0]->message->content ?? '{}'; + $mappedAttributes = json_decode($content, true); + + // Log the final mapped attributes + Log::info('Mapped attributes', [ + 'mapped' => $mappedAttributes + ]); + + return $mappedAttributes; + } + private function determineProductType(SellerProduct $sellerProduct): int { $client = $this->openAIService->getClient(); @@ -108,6 +175,8 @@ private function determineProductType(SellerProduct $sellerProduct): int private function translateProductData(string $text, string $targetLocale): string { + return $text; // TODO + $client = $this->openAIService->getClient(); $response = $client->chat()->create([ diff --git a/database/migrations/2024_12_04_163110_create_sellers_table.php b/database/migrations/2024_12_04_172849_create_sellers_table.php similarity index 100% rename from database/migrations/2024_12_04_163110_create_sellers_table.php rename to database/migrations/2024_12_04_172849_create_sellers_table.php diff --git a/database/migrations/2024_12_04_163111_create_partnerships_table.php b/database/migrations/2024_12_04_172850_create_partnerships_table.php similarity index 100% rename from database/migrations/2024_12_04_163111_create_partnerships_table.php rename to database/migrations/2024_12_04_172850_create_partnerships_table.php diff --git a/database/migrations/2024_12_04_163112_create_seller_data_table.php b/database/migrations/2024_12_04_172851_create_seller_data_table.php similarity index 100% rename from database/migrations/2024_12_04_163112_create_seller_data_table.php rename to database/migrations/2024_12_04_172851_create_seller_data_table.php diff --git a/database/migrations/2024_12_04_163113_create_categories_table.php b/database/migrations/2024_12_04_172852_create_categories_table.php similarity index 100% rename from database/migrations/2024_12_04_163113_create_categories_table.php rename to database/migrations/2024_12_04_172852_create_categories_table.php diff --git a/database/migrations/2024_12_04_163114_create_seller_products_table.php b/database/migrations/2024_12_04_172853_create_seller_products_table.php similarity index 100% rename from database/migrations/2024_12_04_163114_create_seller_products_table.php rename to database/migrations/2024_12_04_172853_create_seller_products_table.php diff --git a/database/migrations/2024_12_04_163115_create_seller_product_images_table.php b/database/migrations/2024_12_04_172854_create_seller_product_images_table.php similarity index 100% rename from database/migrations/2024_12_04_163115_create_seller_product_images_table.php rename to database/migrations/2024_12_04_172854_create_seller_product_images_table.php diff --git a/database/migrations/2024_12_04_163116_create_seller_variants_table.php b/database/migrations/2024_12_04_172855_create_seller_variants_table.php similarity index 100% rename from database/migrations/2024_12_04_163116_create_seller_variants_table.php rename to database/migrations/2024_12_04_172855_create_seller_variants_table.php diff --git a/database/migrations/2024_12_04_163117_create_prices_table.php b/database/migrations/2024_12_04_172856_create_prices_table.php similarity index 100% rename from database/migrations/2024_12_04_163117_create_prices_table.php rename to database/migrations/2024_12_04_172856_create_prices_table.php diff --git a/database/migrations/2024_12_04_163118_create_stocks_table.php b/database/migrations/2024_12_04_172857_create_stocks_table.php similarity index 100% rename from database/migrations/2024_12_04_163118_create_stocks_table.php rename to database/migrations/2024_12_04_172857_create_stocks_table.php diff --git a/database/migrations/2024_12_04_163119_create_locations_table.php b/database/migrations/2024_12_04_172858_create_locations_table.php similarity index 100% rename from database/migrations/2024_12_04_163119_create_locations_table.php rename to database/migrations/2024_12_04_172858_create_locations_table.php diff --git a/database/migrations/2024_12_04_163120_create_currencies_table.php b/database/migrations/2024_12_04_172859_create_currencies_table.php similarity index 100% rename from database/migrations/2024_12_04_163120_create_currencies_table.php rename to database/migrations/2024_12_04_172859_create_currencies_table.php diff --git a/database/migrations/2024_12_04_163121_create_messages_table.php b/database/migrations/2024_12_04_172900_create_messages_table.php similarity index 100% rename from database/migrations/2024_12_04_163121_create_messages_table.php rename to database/migrations/2024_12_04_172900_create_messages_table.php diff --git a/database/migrations/2024_12_04_163122_create_product_types_table.php b/database/migrations/2024_12_04_172901_create_product_types_table.php similarity index 100% rename from database/migrations/2024_12_04_163122_create_product_types_table.php rename to database/migrations/2024_12_04_172901_create_product_types_table.php diff --git a/database/migrations/2024_12_04_163123_create_product_type_attributes_table.php b/database/migrations/2024_12_04_172902_create_product_type_attributes_table.php similarity index 100% rename from database/migrations/2024_12_04_163123_create_product_type_attributes_table.php rename to database/migrations/2024_12_04_172902_create_product_type_attributes_table.php diff --git a/database/migrations/2024_12_04_163124_create_golden_products_table.php b/database/migrations/2024_12_04_172903_create_golden_products_table.php similarity index 100% rename from database/migrations/2024_12_04_163124_create_golden_products_table.php rename to database/migrations/2024_12_04_172903_create_golden_products_table.php diff --git a/database/migrations/2024_12_04_163125_create_golden_product_localizeds_table.php b/database/migrations/2024_12_04_172904_create_golden_product_localizeds_table.php similarity index 100% rename from database/migrations/2024_12_04_163125_create_golden_product_localizeds_table.php rename to database/migrations/2024_12_04_172904_create_golden_product_localizeds_table.php diff --git a/database/migrations/2024_12_04_163126_create_golden_product_variants_table.php b/database/migrations/2024_12_04_172905_create_golden_product_variants_table.php similarity index 100% rename from database/migrations/2024_12_04_163126_create_golden_product_variants_table.php rename to database/migrations/2024_12_04_172905_create_golden_product_variants_table.php diff --git a/database/migrations/2024_12_04_163127_create_golden_product_variant_localizeds_table.php b/database/migrations/2024_12_04_172906_create_golden_product_variant_localizeds_table.php similarity index 100% rename from database/migrations/2024_12_04_163127_create_golden_product_variant_localizeds_table.php rename to database/migrations/2024_12_04_172906_create_golden_product_variant_localizeds_table.php diff --git a/database/migrations/2024_12_04_163128_create_locales_table.php b/database/migrations/2024_12_04_172907_create_locales_table.php similarity index 100% rename from database/migrations/2024_12_04_163128_create_locales_table.php rename to database/migrations/2024_12_04_172907_create_locales_table.php diff --git a/database/migrations/2024_12_04_163129_create_seller_user_table.php b/database/migrations/2024_12_04_172908_create_seller_user_table.php similarity index 100% rename from database/migrations/2024_12_04_163129_create_seller_user_table.php rename to database/migrations/2024_12_04_172908_create_seller_user_table.php diff --git a/database/seeders/AttributeSeeder.php b/database/seeders/AttributeSeeder.php index ecfd4e2..83b84db 100644 --- a/database/seeders/AttributeSeeder.php +++ b/database/seeders/AttributeSeeder.php @@ -12,66 +12,129 @@ public function run(): void $attributesByType = [ 'Sneakers' => [ [ - 'name' => 'size', + 'name' => 'material', 'type' => 'select', 'field' => 'Select', 'required' => true, - 'options' => ['36', '37', '38', '39', '40', '41', '42', '43', '44', '45'] + 'options' => [ + ['label' => 'Leather', 'value' => 'leather'], + ['label' => 'Canvas', 'value' => 'canvas'], + ['label' => 'Synthetic', 'value' => 'synthetic'], + ['label' => 'Mesh', 'value' => 'mesh'], + ['label' => 'Suede', 'value' => 'suede'] + ], + 'description' => 'Main material of the sneaker' ], [ - 'name' => 'color', - 'type' => 'select', - 'field' => 'ColorPicker', + 'name' => 'is_waterproof', + 'type' => 'boolean', + 'field' => 'Toggle', 'required' => true, - 'options' => ['Black', 'White', 'Red', 'Blue', 'Grey'] + 'description' => 'Whether the sneaker is waterproof' + ], + [ + 'name' => 'product_description', + 'type' => 'text', + 'field' => 'Textarea', + 'required' => false, + 'description' => 'Detailed product description with formatting' ] ], 'T-Shirt' => [ [ - 'name' => 'size', - 'type' => 'select', - 'field' => 'Select', + 'name' => 'fabric_composition', + 'type' => 'text', + 'field' => 'TextInput', 'required' => true, - 'options' => ['XS', 'S', 'M', 'L', 'XL', 'XXL'] + 'description' => 'Material composition (e.g., "100% Cotton")' ], [ - 'name' => 'color', + 'name' => 'style_categories', 'type' => 'select', - 'field' => 'ColorPicker', + 'field' => 'Select', 'required' => true, - 'options' => ['Black', 'White', 'Navy', 'Grey', 'Red'] + 'options' => [ + ['label' => 'Casual', 'value' => 'casual'], + ['label' => 'Sport', 'value' => 'sport'], + ['label' => 'Streetwear', 'value' => 'streetwear'], + ['label' => 'Business', 'value' => 'business'] + ], + 'description' => 'Style categories this shirt belongs to' + ], + [ + 'name' => 'is_sustainable', + 'type' => 'boolean', + 'field' => 'Checkbox', + 'required' => false, + 'description' => 'Made with sustainable materials/processes' ] ], 'Jeans' => [ [ - 'name' => 'size', + 'name' => 'fit_style', 'type' => 'select', 'field' => 'Select', 'required' => true, - 'options' => ['28/30', '30/30', '32/30', '34/30', '36/30', '28/32', '30/32', '32/32', '34/32', '36/32'] + 'options' => [ + ['label' => 'Skinny', 'value' => 'skinny'], + ['label' => 'Slim', 'value' => 'slim'], + ['label' => 'Regular', 'value' => 'regular'], + ['label' => 'Relaxed', 'value' => 'relaxed'], + ['label' => 'Bootcut', 'value' => 'bootcut'] + ], + 'description' => 'Style of the fit' + ], + [ + 'name' => 'fabric_weight', + 'type' => 'number', + 'field' => 'TextInput', + 'required' => true, + 'description' => 'Weight of the denim in oz/yd²', + 'unit' => 'oz/yd²' ], [ - 'name' => 'wash', + 'name' => 'features', 'type' => 'select', 'field' => 'Select', 'required' => true, - 'options' => ['Light', 'Medium', 'Dark', 'Black', 'Raw'] + 'options' => [ + ['label' => 'Stretch', 'value' => 'stretch'], + ['label' => 'Distressed', 'value' => 'distressed'], + ['label' => 'Raw Denim', 'value' => 'raw_denim'], + ['label' => 'Stone Washed', 'value' => 'stone_washed'], + ['label' => 'Ripped', 'value' => 'ripped'] + ], + 'description' => 'Special features of the jeans' ] ], 'Dress' => [ [ - 'name' => 'size', + 'name' => 'style', 'type' => 'select', 'field' => 'Select', 'required' => true, - 'options' => ['XS', 'S', 'M', 'L', 'XL'] + 'options' => [ + ['label' => 'Casual', 'value' => 'casual'], + ['label' => 'Formal', 'value' => 'formal'], + ['label' => 'Party', 'value' => 'party'], + ['label' => 'Business', 'value' => 'business'], + ['label' => 'Evening', 'value' => 'evening'] + ], + 'description' => 'Style category of the dress' ], [ - 'name' => 'color', - 'type' => 'select', + 'name' => 'care_instructions', + 'type' => 'text', + 'field' => 'Textarea', + 'required' => true, + 'description' => 'Care and washing instructions' + ], + [ + 'name' => 'primary_color', + 'type' => 'color', 'field' => 'ColorPicker', 'required' => true, - 'options' => ['Black', 'Navy', 'Red', 'White', 'Floral'] + 'description' => 'Primary color of the dress' ] ] ]; From 4f565fa35a21cd3ac412b3f229f433a92e4d00c5 Mon Sep 17 00:00:00 2001 From: Fabian Wesner Date: Wed, 11 Dec 2024 16:32:32 +0100 Subject: [PATCH 15/19] ... --- .blueprint | 68 +- .../AttributesRelationManager.php | 120 ++- .../Resources/SellerProductResource.php | 4 +- app/Models/GoldenProduct.php | 5 + app/Models/GoldenProductAttribute.php | 57 ++ app/Models/GoldenProductAttributeValue.php | 44 + app/Models/GoldenProductImage.php | 45 + app/Models/ProductTypeAttribute.php | 9 +- app/Models/ProductTypeAttributeOption.php | 42 + .../ProductTypeAttributeOptionValue.php | 50 ++ app/Models/SellerProductImage.php | 6 + app/Services/AttributeMappingService.php | 116 +++ app/Services/GoldenProductService.php | 304 +++---- app/Services/OpenAI/OpenAIChatWrapper.php | 63 ++ app/Services/OpenAI/OpenAIClientWrapper.php | 26 + app/Services/OpenAIService.php | 10 +- app/Services/PrismService.php | 21 + app/Services/ProductTranslationService.php | 102 +++ .../ProductTypeClassificationService.php | 79 ++ commands.txt | 3 + composer.json | 3 +- composer.lock | 147 ++- config/app.php | 130 --- config/auth.php | 115 --- config/blueprint.php | 162 ---- config/cache.php | 108 --- config/database.php | 173 ---- config/filament.php | 89 -- config/filesystems.php | 77 -- config/logging.php | 132 --- config/mail.php | 116 --- config/queue.php | 112 --- config/services.php | 38 - config/session.php | 217 ----- database/dbschema.dbs | 801 +++++++++++++++++ database/dbschema.dbs.bak | 795 +++++++++++++++++ .../GoldenProductAttributeFactory.php | 31 + .../GoldenProductAttributeValueFactory.php | 31 + .../factories/GoldenProductImageFactory.php | 32 + .../factories/ProductTypeAttributeFactory.php | 2 +- .../ProductTypeAttributeOptionFactory.php | 28 + ...ProductTypeAttributeOptionValueFactory.php | 31 + ...024_12_11_153010_create_sellers_table.php} | 0 ...2_11_153011_create_partnerships_table.php} | 2 +- ...12_11_153012_create_seller_data_table.php} | 2 +- ..._12_11_153013_create_categories_table.php} | 2 +- ...1_153014_create_seller_products_table.php} | 6 +- ...15_create_seller_product_images_table.php} | 4 +- ...1_153016_create_seller_variants_table.php} | 4 +- ...2024_12_11_153017_create_prices_table.php} | 6 +- ...2024_12_11_153018_create_stocks_table.php} | 8 +- ...4_12_11_153019_create_locations_table.php} | 2 +- ..._12_11_153020_create_currencies_table.php} | 0 ...24_12_11_153021_create_messages_table.php} | 4 +- ..._11_153022_create_product_types_table.php} | 0 ..._create_product_type_attributes_table.php} | 4 +- ...e_product_type_attribute_options_table.php | 32 + ...uct_type_attribute_option_values_table.php | 34 + ...1_153026_create_golden_products_table.php} | 2 +- ...create_golden_product_attributes_table.php | 34 + ..._golden_product_attribute_values_table.php | 34 + ...reate_golden_product_localizeds_table.php} | 4 +- ..._create_golden_product_variants_table.php} | 2 +- ...lden_product_variant_localizeds_table.php} | 4 +- ...032_create_golden_product_images_table.php | 35 + ...024_12_11_153033_create_locales_table.php} | 0 ...12_11_153034_create_seller_user_table.php} | 8 +- ...duct_type_attribute_option_value_table.php | 31 + ..._12_11_153036_create_optionValue_table.php | 31 + database/seeders/AttributeSeeder.php | 840 ++++++++++++++++-- database/seeders/DatabaseSeeder.php | 2 +- draft.yaml | 45 +- public/vendor/log-viewer/app.css | 1 + public/vendor/log-viewer/app.js | 2 + public/vendor/log-viewer/app.js.LICENSE.txt | 33 + .../vendor/log-viewer/img/log-viewer-128.png | Bin 0 -> 1871 bytes .../vendor/log-viewer/img/log-viewer-32.png | Bin 0 -> 526 bytes .../vendor/log-viewer/img/log-viewer-64.png | Bin 0 -> 970 bytes public/vendor/log-viewer/mix-manifest.json | 7 + public/vendor/telescope/app-dark.css | 8 + public/vendor/telescope/app.css | 7 + public/vendor/telescope/app.js | 2 + public/vendor/telescope/favicon.ico | Bin 0 -> 26622 bytes public/vendor/telescope/mix-manifest.json | 5 + specs.md | 36 +- 85 files changed, 4006 insertions(+), 1821 deletions(-) create mode 100644 app/Models/GoldenProductAttribute.php create mode 100644 app/Models/GoldenProductAttributeValue.php create mode 100644 app/Models/GoldenProductImage.php create mode 100644 app/Models/ProductTypeAttributeOption.php create mode 100644 app/Models/ProductTypeAttributeOptionValue.php create mode 100644 app/Services/AttributeMappingService.php create mode 100644 app/Services/OpenAI/OpenAIChatWrapper.php create mode 100644 app/Services/OpenAI/OpenAIClientWrapper.php create mode 100644 app/Services/PrismService.php create mode 100644 app/Services/ProductTranslationService.php create mode 100644 app/Services/ProductTypeClassificationService.php delete mode 100644 config/app.php delete mode 100644 config/auth.php delete mode 100644 config/blueprint.php delete mode 100644 config/cache.php delete mode 100644 config/database.php delete mode 100644 config/filament.php delete mode 100644 config/filesystems.php delete mode 100644 config/logging.php delete mode 100644 config/mail.php delete mode 100644 config/queue.php delete mode 100644 config/services.php delete mode 100644 config/session.php create mode 100644 database/dbschema.dbs create mode 100644 database/dbschema.dbs.bak create mode 100644 database/factories/GoldenProductAttributeFactory.php create mode 100644 database/factories/GoldenProductAttributeValueFactory.php create mode 100644 database/factories/GoldenProductImageFactory.php create mode 100644 database/factories/ProductTypeAttributeOptionFactory.php create mode 100644 database/factories/ProductTypeAttributeOptionValueFactory.php rename database/migrations/{2024_12_04_172849_create_sellers_table.php => 2024_12_11_153010_create_sellers_table.php} (100%) rename database/migrations/{2024_12_04_172850_create_partnerships_table.php => 2024_12_11_153011_create_partnerships_table.php} (90%) rename database/migrations/{2024_12_04_172851_create_seller_data_table.php => 2024_12_11_153012_create_seller_data_table.php} (94%) rename database/migrations/{2024_12_04_172852_create_categories_table.php => 2024_12_11_153013_create_categories_table.php} (93%) rename database/migrations/{2024_12_04_172853_create_seller_products_table.php => 2024_12_11_153014_create_seller_products_table.php} (87%) rename database/migrations/{2024_12_04_172854_create_seller_product_images_table.php => 2024_12_11_153015_create_seller_product_images_table.php} (90%) rename database/migrations/{2024_12_04_172855_create_seller_variants_table.php => 2024_12_11_153016_create_seller_variants_table.php} (87%) rename database/migrations/{2024_12_04_172856_create_prices_table.php => 2024_12_11_153017_create_prices_table.php} (80%) rename database/migrations/{2024_12_04_172857_create_stocks_table.php => 2024_12_11_153018_create_stocks_table.php} (76%) rename database/migrations/{2024_12_04_172858_create_locations_table.php => 2024_12_11_153019_create_locations_table.php} (88%) rename database/migrations/{2024_12_04_172859_create_currencies_table.php => 2024_12_11_153020_create_currencies_table.php} (100%) rename database/migrations/{2024_12_04_172900_create_messages_table.php => 2024_12_11_153021_create_messages_table.php} (83%) rename database/migrations/{2024_12_04_172901_create_product_types_table.php => 2024_12_11_153022_create_product_types_table.php} (100%) rename database/migrations/{2024_12_04_172902_create_product_type_attributes_table.php => 2024_12_11_153023_create_product_type_attributes_table.php} (89%) create mode 100644 database/migrations/2024_12_11_153024_create_product_type_attribute_options_table.php create mode 100644 database/migrations/2024_12_11_153025_create_product_type_attribute_option_values_table.php rename database/migrations/{2024_12_04_172903_create_golden_products_table.php => 2024_12_11_153026_create_golden_products_table.php} (86%) create mode 100644 database/migrations/2024_12_11_153027_create_golden_product_attributes_table.php create mode 100644 database/migrations/2024_12_11_153028_create_golden_product_attribute_values_table.php rename database/migrations/{2024_12_04_172904_create_golden_product_localizeds_table.php => 2024_12_11_153029_create_golden_product_localizeds_table.php} (86%) rename database/migrations/{2024_12_04_172905_create_golden_product_variants_table.php => 2024_12_11_153030_create_golden_product_variants_table.php} (94%) rename database/migrations/{2024_12_04_172906_create_golden_product_variant_localizeds_table.php => 2024_12_11_153031_create_golden_product_variant_localizeds_table.php} (86%) create mode 100644 database/migrations/2024_12_11_153032_create_golden_product_images_table.php rename database/migrations/{2024_12_04_172907_create_locales_table.php => 2024_12_11_153033_create_locales_table.php} (100%) rename database/migrations/{2024_12_04_172908_create_seller_user_table.php => 2024_12_11_153034_create_seller_user_table.php} (62%) create mode 100644 database/migrations/2024_12_11_153035_create_golden_product_attribute_product_type_attribute_option_value_table.php create mode 100644 database/migrations/2024_12_11_153036_create_optionValue_table.php create mode 100644 public/vendor/log-viewer/app.css create mode 100644 public/vendor/log-viewer/app.js create mode 100644 public/vendor/log-viewer/app.js.LICENSE.txt create mode 100644 public/vendor/log-viewer/img/log-viewer-128.png create mode 100644 public/vendor/log-viewer/img/log-viewer-32.png create mode 100644 public/vendor/log-viewer/img/log-viewer-64.png create mode 100644 public/vendor/log-viewer/mix-manifest.json create mode 100644 public/vendor/telescope/app-dark.css create mode 100644 public/vendor/telescope/app.css create mode 100644 public/vendor/telescope/app.js create mode 100644 public/vendor/telescope/favicon.ico create mode 100644 public/vendor/telescope/mix-manifest.json diff --git a/.blueprint b/.blueprint index 55a4656..bdd739d 100644 --- a/.blueprint +++ b/.blueprint @@ -13,31 +13,43 @@ created: - database/factories/MessageFactory.php - database/factories/ProductTypeFactory.php - database/factories/ProductTypeAttributeFactory.php + - database/factories/ProductTypeAttributeOptionFactory.php + - database/factories/ProductTypeAttributeOptionValueFactory.php - database/factories/GoldenProductFactory.php + - database/factories/GoldenProductAttributeFactory.php + - database/factories/GoldenProductAttributeValueFactory.php - database/factories/GoldenProductLocalizedFactory.php - database/factories/GoldenProductVariantFactory.php - database/factories/GoldenProductVariantLocalizedFactory.php + - database/factories/GoldenProductImageFactory.php - database/factories/LocaleFactory.php - - database/migrations/2024_12_04_172849_create_sellers_table.php - - database/migrations/2024_12_04_172850_create_partnerships_table.php - - database/migrations/2024_12_04_172851_create_seller_data_table.php - - database/migrations/2024_12_04_172852_create_categories_table.php - - database/migrations/2024_12_04_172853_create_seller_products_table.php - - database/migrations/2024_12_04_172854_create_seller_product_images_table.php - - database/migrations/2024_12_04_172855_create_seller_variants_table.php - - database/migrations/2024_12_04_172856_create_prices_table.php - - database/migrations/2024_12_04_172857_create_stocks_table.php - - database/migrations/2024_12_04_172858_create_locations_table.php - - database/migrations/2024_12_04_172859_create_currencies_table.php - - database/migrations/2024_12_04_172900_create_messages_table.php - - database/migrations/2024_12_04_172901_create_product_types_table.php - - database/migrations/2024_12_04_172902_create_product_type_attributes_table.php - - database/migrations/2024_12_04_172903_create_golden_products_table.php - - database/migrations/2024_12_04_172904_create_golden_product_localizeds_table.php - - database/migrations/2024_12_04_172905_create_golden_product_variants_table.php - - database/migrations/2024_12_04_172906_create_golden_product_variant_localizeds_table.php - - database/migrations/2024_12_04_172907_create_locales_table.php - - database/migrations/2024_12_04_172908_create_seller_user_table.php + - database/migrations/2024_12_11_153010_create_sellers_table.php + - database/migrations/2024_12_11_153011_create_partnerships_table.php + - database/migrations/2024_12_11_153012_create_seller_data_table.php + - database/migrations/2024_12_11_153013_create_categories_table.php + - database/migrations/2024_12_11_153014_create_seller_products_table.php + - database/migrations/2024_12_11_153015_create_seller_product_images_table.php + - database/migrations/2024_12_11_153016_create_seller_variants_table.php + - database/migrations/2024_12_11_153017_create_prices_table.php + - database/migrations/2024_12_11_153018_create_stocks_table.php + - database/migrations/2024_12_11_153019_create_locations_table.php + - database/migrations/2024_12_11_153020_create_currencies_table.php + - database/migrations/2024_12_11_153021_create_messages_table.php + - database/migrations/2024_12_11_153022_create_product_types_table.php + - database/migrations/2024_12_11_153023_create_product_type_attributes_table.php + - database/migrations/2024_12_11_153024_create_product_type_attribute_options_table.php + - database/migrations/2024_12_11_153025_create_product_type_attribute_option_values_table.php + - database/migrations/2024_12_11_153026_create_golden_products_table.php + - database/migrations/2024_12_11_153027_create_golden_product_attributes_table.php + - database/migrations/2024_12_11_153028_create_golden_product_attribute_values_table.php + - database/migrations/2024_12_11_153029_create_golden_product_localizeds_table.php + - database/migrations/2024_12_11_153030_create_golden_product_variants_table.php + - database/migrations/2024_12_11_153031_create_golden_product_variant_localizeds_table.php + - database/migrations/2024_12_11_153032_create_golden_product_images_table.php + - database/migrations/2024_12_11_153033_create_locales_table.php + - database/migrations/2024_12_11_153034_create_seller_user_table.php + - database/migrations/2024_12_11_153035_create_golden_product_attribute_product_type_attribute_option_value_table.php + - database/migrations/2024_12_11_153036_create_optionValue_table.php - app/Models/Seller.php - app/Models/Partnership.php - app/Models/SellerData.php @@ -52,10 +64,15 @@ created: - app/Models/Message.php - app/Models/ProductType.php - app/Models/ProductTypeAttribute.php + - app/Models/ProductTypeAttributeOption.php + - app/Models/ProductTypeAttributeOptionValue.php - app/Models/GoldenProduct.php + - app/Models/GoldenProductAttribute.php + - app/Models/GoldenProductAttributeValue.php - app/Models/GoldenProductLocalized.php - app/Models/GoldenProductVariant.php - app/Models/GoldenProductVariantLocalized.php + - app/Models/GoldenProductImage.php - app/Models/Locale.php models: Customer: { } @@ -67,7 +84,7 @@ models: SellerData: { seller_id: 'id foreign', email: 'string nullable', description: 'text nullable', company_name: 'string nullable', address_line1: 'string nullable', address_line2: 'string nullable', city: 'string nullable', state: 'string nullable', postal_code: 'string nullable', country_code: 'string nullable', phone: 'string nullable', vat: 'string nullable', tin: 'string nullable', eori: 'string nullable', iban: 'string nullable', swift_bic: 'string nullable', bank_name: 'string nullable', account_holder_name: 'string nullable', file1: 'string nullable', file2: 'string nullable', file3: 'string nullable' } Category: { name: string, description: 'text nullable', is_active: 'boolean nullable', parent_id: 'id foreign:categories.id nullable', relationships: { hasMany: SellerProduct } } SellerProduct: { name: string, brand: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', category_id: 'id foreign nullable', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', selected: 'boolean default:false', ean: 'string nullable', upc: 'string nullable', gtin_14: 'string nullable', gtin_8: 'string nullable', golden_product_id: 'id foreign nullable', relationships: { hasMany: 'SellerVariant,Price,Stock,SellerProductImage:image' } } - SellerProductImage: { seller_product_id: 'id foreign', seller_variant_id: 'id foreign nullable', image: string, number: 'integer default:1' } + SellerProductImage: { seller_product_id: 'id foreign', seller_variant_id: 'id foreign nullable', image: string, number: 'integer default:1', relationships: { hasOne: GoldenProductImage } } SellerVariant: { name: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', seller_product_id: 'id foreign', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', relationships: { hasMany: 'Price, Stock, SellerProductImage:image' } } Price: { amount: integer, seller_variant_id: 'id foreign nullable', seller_product_id: 'id foreign', currency_id: 'id foreign' } Stock: { quantity: integer, reserved: 'integer nullable', safety_stock: 'integer nullable', seller_variant_id: 'id foreign', seller_product_id: 'id foreign', location_id: 'id foreign', seller_id: 'id foreign' } @@ -75,9 +92,14 @@ models: Currency: { code: string, symbol: string, name: 'string nullable', is_default: 'boolean default:false', relationships: { hasMany: Price } } Message: { content: text, seller_id: 'id foreign', message_id: 'id foreign nullable' } ProductType: { name: string, relationships: { hasMany: 'ProductTypeAttribute:attribute, GoldenProduct:product' } } - ProductTypeAttribute: { name: string, type: 'enum:text,boolean,number,select,url,color', is_translatable: 'boolean default:false', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', options: 'json nullable', validators: 'json nullable', product_type_id: 'id foreign' } - GoldenProduct: { product_type_id: 'id foreign', relationships: { hasMany: 'GoldenProductLocalized:translation, SellerProduct, GoldenProductVariant:variant' } } + ProductTypeAttribute: { name: string, slug: string, type: 'enum:text,boolean,number,select,url,color', is_translatable: 'boolean default:false', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', validators: 'json nullable', product_type_id: 'id foreign', relationships: { hasMany: 'ProductTypeAttributeOption:option' } } + ProductTypeAttributeOption: { product_type_attribute_id: 'id foreign', relationships: { hasMany: 'ProductTypeAttributeOptionValue:value' } } + ProductTypeAttributeOptionValue: { value: string, locale_id: 'id foreign', product_type_attribute_option_id: 'id foreign', relationships: { belongsToMany: GoldenProductAttribute } } + GoldenProduct: { product_type_id: 'id foreign', relationships: { hasMany: 'GoldenProductLocalized:translation, SellerProduct, GoldenProductVariant:variant, GoldenProductAttribute:attribute' } } + GoldenProductAttribute: { product_type_attribute_id: 'id foreign', golden_product_id: 'id foreign', is_option: 'boolean default:false', relationships: { hasMany: 'GoldenProductAttributeValue:value', belongsToMany: 'ProductTypeAttributeOptionValue:optionValue' } } + GoldenProductAttributeValue: { value: string, golden_product_attribute_id: 'id foreign', locale_id: 'id foreign' } GoldenProductLocalized: { name: string, description: 'text nullable', attributes: 'json nullable', locale_id: 'id foreign', golden_product_id: 'id foreign' } GoldenProductVariant: { golden_product_id: 'id foreign', relationships: { hasMany: 'GoldenProductVariantLocalized:translation' } } GoldenProductVariantLocalized: { name: 'string nullable', description: 'text nullable', attributes: 'json nullable', golden_product_variant_id: 'id foreign', locale_id: 'id foreign' } + GoldenProductImage: { golden_product_id: 'id foreign', image: string, number: 'integer default:1', seller_product_image_id: 'id foreign' } Locale: { code: string, name: string, default: boolean } diff --git a/app/Filament/Owner/Resources/ProductTypeResource/RelationManagers/AttributesRelationManager.php b/app/Filament/Owner/Resources/ProductTypeResource/RelationManagers/AttributesRelationManager.php index ae0b8f9..bf4c49b 100644 --- a/app/Filament/Owner/Resources/ProductTypeResource/RelationManagers/AttributesRelationManager.php +++ b/app/Filament/Owner/Resources/ProductTypeResource/RelationManagers/AttributesRelationManager.php @@ -2,11 +2,16 @@ namespace App\Filament\Owner\Resources\ProductTypeResource\RelationManagers; +use App\Models\Locale; +use App\Models\ProductTypeAttribute; +use App\Models\ProductTypeAttributeOption; +use App\Models\ProductTypeAttributeOptionValue; use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\RelationManagers\RelationManager; use Filament\Tables; use Filament\Tables\Table; +use Illuminate\Support\Str; class AttributesRelationManager extends RelationManager { @@ -20,13 +25,26 @@ public function form(Form $form): Form ->schema([ Forms\Components\Section::make('Basic Attribute Information') ->schema([ - Forms\Components\TextInput::make('name') - ->required() - ->maxLength(255) - ->label('Attribute Name') - ->columnSpan(2) - ->placeholder('e.g., Color, Size, Material') - ->helperText('Enter a unique, descriptive name for this attribute.'), + Forms\Components\Grid::make(2) + ->schema([ + Forms\Components\TextInput::make('name') + ->required() + ->maxLength(255) + ->label('Attribute Name') + ->live(onBlur: true) + ->afterStateUpdated(function (string $state, Forms\Set $set) { + $set('slug', Str::slug($state)); + }) + ->columnSpan(1) + ->placeholder('e.g., Color, Size, Material') + ->helperText('Enter a unique, descriptive name for this attribute.'), + + Forms\Components\TextInput::make('slug') + ->disabled() + ->dehydrated() + ->columnSpan(1) + ->helperText('Automatically generated from name'), + ]), Forms\Components\Toggle::make('is_variant_attribute') ->label('Is Variant Attribute') @@ -115,20 +133,87 @@ public function form(Form $form): Form Forms\Components\Repeater::make('options') ->label('Options') ->schema([ - Forms\Components\Grid::make(2) - ->schema([ - Forms\Components\TextInput::make('label') - ->required(), - Forms\Components\TextInput::make('value') - ->required(), - ]), + Forms\Components\Grid::make() + ->schema(function (Forms\Get $get) { + $fields = []; + $defaultLocale = Locale::where('default', true)->first(); + + foreach (Locale::orderBy('default', 'desc')->get() as $locale) { + $fields[] = Forms\Components\TextInput::make("values.{$locale->code}") + ->label($locale->name) + ->required($locale->default) + ->disabled(fn() => !$locale->default && !$get('../../is_translatable')) + ->helperText($locale->default ? 'Default language' : null) + ->live() + ->afterStateUpdated(function ($state, Forms\Set $set, Forms\Get $get) use ($locale, $defaultLocale) { + // If this is the default locale and is_translatable is false, + // copy the value to all other locales + if ($locale->default && !$get('../../is_translatable')) { + foreach (Locale::where('default', false)->get() as $otherLocale) { + $set("values.{$otherLocale->code}", $state); + } + } + }); + } + + return $fields; + }) + ->columns(2), ]) ->collapsible() ->collapsed() - ->itemLabel(fn(array $state): ?string => $state['label'] ?? null) + ->itemLabel(function (array $state): ?string { + $defaultLocale = Locale::where('default', true)->first(); + return $state['values'][$defaultLocale->code] ?? null; + }) ->defaultItems(0) ->visible(fn(Forms\Get $get): bool => $get('field') === 'Select' || $get('field') === 'ColorPicker') - ->columnSpanFull(), + ->columnSpanFull() + // Load options from the relationship + ->afterStateHydrated(function (Forms\Get $get, Forms\Set $set, ?ProductTypeAttribute $record) { + if (!$record) return; + + $options = $record->options->map(function ($option) { + $values = []; + + foreach ($option->values as $value) { + $values[$value->locale->code] = $value->value; + } + + return [ + 'values' => $values, + ]; + })->toArray(); + + $set('options', $options); + }) + // Save options to the relationship + ->afterStateUpdated(function ($state, ?ProductTypeAttribute $record) { + if (!$record) return; + + // Delete existing options and their values + foreach ($record->options as $option) { + $option->values()->delete(); + } + $record->options()->delete(); + + // Create new options with localized values + foreach ($state ?? [] as $optionData) { + $option = $record->options()->create([ + 'product_type_attribute_id' => $record->id, + ]); + + // Create values for each locale + foreach (Locale::all() as $locale) { + if (isset($optionData['values'][$locale->code])) { + $option->values()->create([ + 'value' => $optionData['values'][$locale->code], + 'locale_id' => $locale->id, + ]); + } + } + } + }), Forms\Components\TextInput::make('unit') ->maxLength(255) @@ -209,6 +294,9 @@ public function table(Table $table): Table Tables\Columns\TextColumn::make('name') ->searchable() ->sortable(), + Tables\Columns\TextColumn::make('slug') + ->badge() + ->color('gray'), Tables\Columns\IconColumn::make('required') ->boolean() ->sortable(), diff --git a/app/Filament/Seller/Resources/SellerProductResource.php b/app/Filament/Seller/Resources/SellerProductResource.php index de97743..7cd0d48 100644 --- a/app/Filament/Seller/Resources/SellerProductResource.php +++ b/app/Filament/Seller/Resources/SellerProductResource.php @@ -76,7 +76,7 @@ public static function form(Form $form): Form ->native(false) ->helperText('Only Active products can be sold on the marketplace.') ->afterStateUpdated(function ($state, $old, $record) { - if ($state === 'active' && $old !== 'active') { + if ($state === 'active' && $old !== 'active') { // TODO app(GoldenProductService::class)->createFromSellerProduct($record); } }), @@ -103,7 +103,7 @@ public static function form(Form $form): Form ->editableValues(), ]) ->collapsible() - ->collapsed() + // ->collapsed() TODO ->columns(3), Forms\Components\Section::make('Default Prices') diff --git a/app/Models/GoldenProduct.php b/app/Models/GoldenProduct.php index 4858116..752c63b 100644 --- a/app/Models/GoldenProduct.php +++ b/app/Models/GoldenProduct.php @@ -45,6 +45,11 @@ public function variants(): HasMany return $this->hasMany(GoldenProductVariant::class); } + public function attributes(): HasMany + { + return $this->hasMany(GoldenProductAttribute::class); + } + public function productType(): BelongsTo { return $this->belongsTo(ProductType::class); diff --git a/app/Models/GoldenProductAttribute.php b/app/Models/GoldenProductAttribute.php new file mode 100644 index 0000000..7e28c05 --- /dev/null +++ b/app/Models/GoldenProductAttribute.php @@ -0,0 +1,57 @@ + 'integer', + 'product_type_attribute_id' => 'integer', + 'golden_product_id' => 'integer', + 'is_option' => 'boolean', + ]; + + public function values(): HasMany + { + return $this->hasMany(GoldenProductAttributeValue::class); + } + + public function productTypeAttributeOptionValues(): BelongsToMany + { + return $this->belongsToMany(ProductTypeAttributeOptionValue::class, 'optionValue'); + } + + public function productTypeAttribute(): BelongsTo + { + return $this->belongsTo(ProductTypeAttribute::class); + } + + public function goldenProduct(): BelongsTo + { + return $this->belongsTo(GoldenProduct::class); + } +} diff --git a/app/Models/GoldenProductAttributeValue.php b/app/Models/GoldenProductAttributeValue.php new file mode 100644 index 0000000..ccae91a --- /dev/null +++ b/app/Models/GoldenProductAttributeValue.php @@ -0,0 +1,44 @@ + 'integer', + 'golden_product_attribute_id' => 'integer', + 'locale_id' => 'integer', + ]; + + public function goldenProductAttribute(): BelongsTo + { + return $this->belongsTo(GoldenProductAttribute::class); + } + + public function locale(): BelongsTo + { + return $this->belongsTo(Locale::class); + } +} diff --git a/app/Models/GoldenProductImage.php b/app/Models/GoldenProductImage.php new file mode 100644 index 0000000..6caa2a7 --- /dev/null +++ b/app/Models/GoldenProductImage.php @@ -0,0 +1,45 @@ + 'integer', + 'golden_product_id' => 'integer', + 'seller_product_image_id' => 'integer', + ]; + + public function goldenProduct(): BelongsTo + { + return $this->belongsTo(GoldenProduct::class); + } + + public function sellerProductImage(): BelongsTo + { + return $this->belongsTo(SellerProductImage::class); + } +} diff --git a/app/Models/ProductTypeAttribute.php b/app/Models/ProductTypeAttribute.php index 947e261..8c1991c 100644 --- a/app/Models/ProductTypeAttribute.php +++ b/app/Models/ProductTypeAttribute.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; class ProductTypeAttribute extends Model { @@ -17,6 +18,7 @@ class ProductTypeAttribute extends Model */ protected $fillable = [ 'name', + 'slug', 'type', 'is_translatable', 'field', @@ -25,7 +27,6 @@ class ProductTypeAttribute extends Model 'description', 'unit', 'is_variant_attribute', - 'options', 'validators', 'product_type_id', ]; @@ -40,11 +41,15 @@ class ProductTypeAttribute extends Model 'is_translatable' => 'boolean', 'required' => 'boolean', 'is_variant_attribute' => 'boolean', - 'options' => 'array', 'validators' => 'array', 'product_type_id' => 'integer', ]; + public function options(): HasMany + { + return $this->hasMany(ProductTypeAttributeOption::class); + } + public function productType(): BelongsTo { return $this->belongsTo(ProductType::class); diff --git a/app/Models/ProductTypeAttributeOption.php b/app/Models/ProductTypeAttributeOption.php new file mode 100644 index 0000000..feb5efa --- /dev/null +++ b/app/Models/ProductTypeAttributeOption.php @@ -0,0 +1,42 @@ + 'integer', + 'product_type_attribute_id' => 'integer', + ]; + + public function values(): HasMany + { + return $this->hasMany(ProductTypeAttributeOptionValue::class); + } + + public function productTypeAttribute(): BelongsTo + { + return $this->belongsTo(ProductTypeAttribute::class); + } +} diff --git a/app/Models/ProductTypeAttributeOptionValue.php b/app/Models/ProductTypeAttributeOptionValue.php new file mode 100644 index 0000000..0eab0a2 --- /dev/null +++ b/app/Models/ProductTypeAttributeOptionValue.php @@ -0,0 +1,50 @@ + 'integer', + 'locale_id' => 'integer', + 'product_type_attribute_option_id' => 'integer', + ]; + + public function goldenProductAttributes(): BelongsToMany + { + return $this->belongsToMany(GoldenProductAttribute::class); + } + + public function locale(): BelongsTo + { + return $this->belongsTo(Locale::class); + } + + public function productTypeAttributeOption(): BelongsTo + { + return $this->belongsTo(ProductTypeAttributeOption::class); + } +} diff --git a/app/Models/SellerProductImage.php b/app/Models/SellerProductImage.php index 291fc62..2ce7fa4 100644 --- a/app/Models/SellerProductImage.php +++ b/app/Models/SellerProductImage.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasOne; class SellerProductImage extends Model { @@ -33,6 +34,11 @@ class SellerProductImage extends Model 'seller_variant_id' => 'integer', ]; + public function goldenProductImage(): HasOne + { + return $this->hasOne(GoldenProductImage::class); + } + public function sellerProduct(): BelongsTo { return $this->belongsTo(SellerProduct::class); diff --git a/app/Services/AttributeMappingService.php b/app/Services/AttributeMappingService.php new file mode 100644 index 0000000..088852f --- /dev/null +++ b/app/Services/AttributeMappingService.php @@ -0,0 +1,116 @@ +stringifyProductType($productType); + $attributeString = $this->stringifySellerAttributes($sellerAttributes); + $client = $this->openAIService->getClient(); + $response = $this->performAIRequest($client, $attributeString, $attributeSchemaString); + $mappedAttributes = json_decode($response->choices[0]->message->content, true); + return $mappedAttributes ?? []; + } + + /** + * @param array $sellerAttributes + * @return string + */ + public function stringifySellerAttributes(array $sellerAttributes): string + { + $attributeString = ''; + foreach ($sellerAttributes as $k => $v) { + $attributeString .= ' - ' . $k . ': ' . $v . "\n"; + } + return $attributeString; + } + + /** + * @param ProductType $productType + * @return string + */ + public function stringifyProductType(ProductType $productType): string + { + $attributeSchemaString = ''; + foreach ($productType->attributes as $attribute) { + $attributeSchemaString .= collect([ + 'ID: ' . $attribute->id, + 'Attribute: ' . $attribute->name, + 'Type: ' . $attribute->type, + 'Description: ' . $attribute->description, + !empty($attribute->unit) + ? 'Unit: ' . $attribute->unit + : null, + !empty($attribute->options) + ? 'Valid options (You must select an ID): [' . collect($attribute->options)->map(fn($option) => "{$option->id}: \"{$option->label}\"")->join(', ') . ']' + : null, + ]) + ->filter() + ->join(' | ') . "\n"; + } + return $attributeSchemaString; + } + + public function performAIRequest(OpenAI\OpenAIClientWrapper $client, string $attributeString, string $attributeSchemaString): \OpenAI\Responses\Chat\CreateResponse + { + $response = $client->chat()->create([ + 'model' => $this->openAIService->getSmallModel(), + 'messages' => [ + [ + 'role' => 'system', + 'content' => "You are a product attribute mapper. Map the seller's product attributes to our predefined schema following these rules: +1. Match attributes based on semantic similarity +2. Convert values to match the required type and unit +3. For attributes with predefined options, use only valid values +4. Return the result as a JSON object where keys are our attribute IDs and values are the mapped values +5. Skip attributes that don't have a good match in our schema + +Response Format: +{ + \"attribute_id\": value, // where attribute_id is a number and value depends on the attribute type: + // For 'select' type: value must be one of the provided option IDs (number) + // For 'text' type: value must be a string + // For 'number' type: value must be a number matching the specified unit + // For 'boolean' type: value must be true or false + // For 'color' type: value must be a valid hex color code (e.g., \"#FF0000\") +} + +Example Response: +{ + \"11\": 42, // select type with option ID 42 + \"22\": \"text\", // text type + \"33\": 180, // number type + \"44\": true, // boolean type + \"55\": \"#FF0000\" // color type +}" + ], + [ + 'role' => 'user', + 'content' => "Map these seller attributes to our schema: + +Seller's attributes: +$attributeString + +Our attribute schema: +$attributeSchemaString + +Respond with a valid JSON object where keys are our attribute IDs and values are the mapped values. You must not write any additional text or add quotes or backticks." + ] + ], + 'response_format' => ['type' => 'json_object'] + ]); + return $response; + } +} diff --git a/app/Services/GoldenProductService.php b/app/Services/GoldenProductService.php index 67edb88..9f7eba3 100644 --- a/app/Services/GoldenProductService.php +++ b/app/Services/GoldenProductService.php @@ -6,211 +6,163 @@ use App\Models\SellerProduct; use App\Models\ProductType; use App\Models\Locale; +use App\Models\ProductTypeAttribute; +use App\Models\ProductTypeAttributeOptionValue; +use App\Models\GoldenProductAttribute; +use App\Models\GoldenProductAttributeValue; use App\Services\OpenAIService; +use App\Services\AttributeMappingService; +use App\Services\ProductTypeClassificationService; +use App\Services\ProductTranslationService; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\DB; class GoldenProductService { - private $openAIService; - - public function __construct(OpenAIService $openAIService) - { - $this->openAIService = $openAIService; - } - + public function __construct( + private readonly OpenAIService $openAIService, + private readonly AttributeMappingService $attributeMapper, + private readonly ProductTypeClassificationService $productTypeClassifier, + private readonly ProductTranslationService $translator, + ) {} + + /** + * TODO This should happen asynchronously + * @throws \Exception + */ public function createFromSellerProduct(SellerProduct $sellerProduct): GoldenProduct { - if ($sellerProduct->golden_product_id) { - return $sellerProduct->goldenProduct; - } + // we don't create a golden product if it already exists + // TODO + // if ($sellerProduct->golden_product_id) { + // return $sellerProduct->goldenProduct; + // } - $productTypeId = $this->determineProductType($sellerProduct); - $productType = ProductType::with('attributes')->find($productTypeId); + $productType = $this->productTypeClassifier->determineProductType($sellerProduct); + $translations = $this->translateProductName($sellerProduct); - // TODO handle the case when the product type is not found + $mappedAttributes = $this->attributeMapper->mapAttributes($sellerProduct->attributes, $productType); + $attributes = $this->translateTextAttributeValues($mappedAttributes, $productType, $translations); + $attributes = $this->addAttributeOptionValues($attributes, $mappedAttributes, $productType); - $goldenProduct = GoldenProduct::create([ - 'product_type_id' => $productTypeId, - ]); + $goldenProduct = $this->createGoldenProduct($productType); - // Create translations with mapped attributes for each locale - foreach (Locale::all() as $locale) { - $translatedName = $this->translateProductData($sellerProduct->name, $locale->code); - $translatedDescription = $this->translateProductData($sellerProduct->description, $locale->code); - - // Map and translate attributes if they exist - $mappedAttributes = null; - if ($sellerProduct->attributes) { - $mappedAttributes = $this->mapAttributes($sellerProduct->attributes, $productType); - if ($locale->code !== 'en') { - $mappedAttributes = json_decode($this->translateProductData( - json_encode($mappedAttributes), - $locale->code - ), true); - } - } + $this->createTranslations($goldenProduct, $translations); + $this->createAttributes($goldenProduct, $attributes); - $goldenProduct->translations()->create([ - 'name' => $translatedName, - 'description' => $translatedDescription, - 'attributes' => $mappedAttributes, - 'locale_id' => $locale->id, - ]); - } - - $sellerProduct->update(['golden_product_id' => $goldenProduct->id]); + $this->updateSellerProduct($sellerProduct, $goldenProduct); return $goldenProduct; } - private function mapAttributes(array $sellerAttributes, ProductType $productType): array - { - $client = $this->openAIService->getClient(); - - // Get the schema of valid attributes from the product type - $attributeSchema = $productType->attributes->map(function ($attr) { - return [ - 'name' => $attr->name, - 'type' => $attr->type, - 'description' => $attr->description, - 'unit' => $attr->unit, - 'options' => $attr->options, - 'is_variant_attribute' => $attr->is_variant_attribute, - ]; - })->toArray(); - - // Log input data for debugging - Log::info('Mapping attributes', [ - 'seller_attributes' => $sellerAttributes, - 'schema' => $attributeSchema - ]); - - $response = $client->chat()->create([ - 'model' => $this->openAIService->getSmallModel(), - 'messages' => [ - [ - 'role' => 'system', - 'content' => "Map the seller's attributes to the product type schema, following these rules: - 1. Match attributes based on semantic similarity and field type compatibility - 2. Convert values to match the required type (text, boolean, number, select, url, color) - 3. Ensure select values match the available options - 4. Return a valid JSON object in the format: { schemaFieldName: convertedValue }" - ], - [ - 'role' => 'user', - 'content' => "Please provide a JSON object mapping these seller attributes to the schema: - - Seller Attributes: " . json_encode($sellerAttributes) . " - - Schema: " . json_encode($attributeSchema) - ] - ], - 'response_format' => ['type' => 'json_object'], - 'temperature' => 0.2 - ]); - - // Log the raw response for debugging - Log::info('OpenAI Response', [ - 'response' => $response - ]); - $content = $response->choices[0]->message->content ?? '{}'; - $mappedAttributes = json_decode($content, true); - // Log the final mapped attributes - Log::info('Mapped attributes', [ - 'mapped' => $mappedAttributes + private function createGoldenProduct(ProductType $productType): GoldenProduct + { + $goldenProduct = GoldenProduct::create([ + 'product_type_id' => $productType->id, ]); - return $mappedAttributes; + return $goldenProduct; } - private function determineProductType(SellerProduct $sellerProduct): int + public function translateProductName(SellerProduct $sellerProduct): array { - $client = $this->openAIService->getClient(); - - $availableTypes = ProductType::pluck('name')->toArray(); - - $response = $client->chat()->create([ - 'model' => $this->openAIService->getSmallModel(), - 'messages' => [ - ['role' => 'user', 'content' => $sellerProduct->name], - ], - 'tools' => [ - [ - 'type' => 'function', - 'function' => [ - 'name' => 'classify_product', - 'description' => 'Classify a product into predefined product types', - 'parameters' => [ - 'type' => 'object', - 'properties' => [ - 'product_type' => [ - 'type' => 'string', - 'enum' => $availableTypes, - 'description' => 'The type of product', - ], - 'confidence' => [ - 'type' => 'number', - 'minimum' => 0, - 'maximum' => 1, - 'description' => 'Confidence level in the classification', - ], - ], - 'required' => ['product_type', 'confidence'], - ], - ], - ], - ], - ]); - - + $translations = []; + foreach (Locale::all() as $locale) { + $translations[$locale->id] = $this->translator->translateTexts([ + 'name' => $sellerProduct->name, + 'description' => $sellerProduct->description + ], $locale->code); + } + return $translations; + } - $toolCall = $response->choices[0]->message->toolCalls[0]; - $arguments = json_decode($toolCall->function->arguments, true); - $productType = ProductType::where('name', $arguments['product_type'])->first(); + public function translateTextAttributeValues(array $mappedAttributes, ProductType $productType, array $translations): array + { + $attributes = []; + foreach (Locale::all() as $locale) { + $attributes[$locale->id] = []; + $toBetranslatedValues = []; + foreach ($mappedAttributes as $attributeConfigId => $value) { + $attributeConfiguration = $productType->attributes->find($attributeConfigId); // TODO too many queries + + if ($attributeConfiguration->type !== 'select' && $attributeConfiguration->is_translatable === true) { + // $translatedValue = $this->translator->translateString($value, $locale->code); + $toBetranslatedValues[$attributeConfigId] = $value; + } + } + $translations = $this->translator->translateTexts($toBetranslatedValues, $locale->code); + foreach ($mappedAttributes as $attributeConfigId => $value) { + if (array_key_exists($attributeConfigId, $translations)) { + $attributes[$locale->id][$attributeConfigId] = $translations[$attributeConfigId]; + } else { + $attributes[$locale->id][$attributeConfigId] = $value; + } + } + } + return $attributes; + } - return $productType ? $productType->id : null; + public function addAttributeOptionValues(array $attributes, array $mappedAttributes, ProductType $productType): array + { + foreach ($mappedAttributes as $attributeConfigId => $value) { + $attributeConfiguration = $productType->attributes->find($attributeConfigId); // TODO too many queries + + foreach (Locale::all() as $locale) { + if ($attributeConfiguration->type === 'select') { + $optionEntity = ProductTypeAttributeOptionValue::where('product_type_attribute_option_id', $value) + ->where('locale_id', $locale->id) + ->first(); + $attributes[$locale->id][$attributeConfigId] = $optionEntity; + } + } + } + return $attributes; } - private function translateProductData(string $text, string $targetLocale): string + private function createTranslations(GoldenProduct $goldenProduct, array $translations): void { - return $text; // TODO - - $client = $this->openAIService->getClient(); - - $response = $client->chat()->create([ - 'model' => $this->openAIService->getSmallModel(), - 'messages' => [ - [ - 'role' => 'user', - 'content' => "Translate the following text to {$targetLocale}:\n\n{$text}" - ], - ], - 'tools' => [ - [ - 'type' => 'function', - 'function' => [ - 'name' => 'translate_text', - 'description' => 'Translate text to the target language while maintaining the original meaning and tone', - 'parameters' => [ - 'type' => 'object', - 'properties' => [ - 'translated_text' => [ - 'type' => 'string', - 'description' => 'The translated text in the target language', - ], - ], - 'required' => ['translated_text'], - ], - ], - ], - ], - ]); + foreach (Locale::all() as $locale) { + $translation = $translations[$locale->id]; + $goldenProduct->translations()->create([ + 'name' => $translation['name'], + 'description' => $translation['description'], + 'locale_id' => $locale->id, + ]); + } + } - $toolCall = $response->choices[0]->message->toolCalls[0]; - $arguments = json_decode($toolCall->function->arguments, true); + private function createAttributes(GoldenProduct $goldenProduct, array $attributes): void + { + foreach ($attributes as $localeId => $attributes) { + foreach ($attributes as $attributeConfigId => $value) { + $goldenProductAttribute = GoldenProductAttribute::create([ + 'golden_product_id' => $goldenProduct->id, + 'product_type_attribute_id' => $attributeConfigId, + ]); + + if (is_scalar($value)) { + GoldenProductAttributeValue::create([ + 'golden_product_attribute_id' => $goldenProductAttribute->id, + 'value' => $value, + 'locale_id' => $localeId + ]); + } else if ($value instanceof ProductTypeAttributeOptionValue) { + // Directly insert into the pivot table + DB::table('golden_product_attribute_product_type_attribute_option_value')->insert([ + 'golden_product_attribute_id' => $goldenProductAttribute->id, + 'product_type_attribute_option_value_id' => $value->id, + ]); + } else { + throw new \Exception('Unsupported attribute value type for value: ' . $value); + } + } + } + } - return $arguments['translated_text']; + private function updateSellerProduct(SellerProduct $sellerProduct, GoldenProduct $goldenProduct): void + { + $sellerProduct->update(['golden_product_id' => $goldenProduct->id]); } } diff --git a/app/Services/OpenAI/OpenAIChatWrapper.php b/app/Services/OpenAI/OpenAIChatWrapper.php new file mode 100644 index 0000000..c360c07 --- /dev/null +++ b/app/Services/OpenAI/OpenAIChatWrapper.php @@ -0,0 +1,63 @@ +chat = $chat; + } + + public function create(array $parameters): CreateResponse + { + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); + $callingClass = isset($backtrace[1]['class']) ? $backtrace[1]['class'] : 'unknown'; + $callingClass = last(explode('\\', $callingClass)); + $callingMethod = debug_backtrace()[1]['function'] ?? 'unknown'; + + $suffix = ' - ' . $callingClass . '::' . $callingMethod; + + // if (isset($parameters['tools'][0]['function']['name'])) { + // $suffix = ' - ' . $parameters['tools'][0]['function']['name']; + // } elseif (isset($parameters['tool_choice']['function']['name'])) { + // $suffix = ' - ' . $parameters['tool_choice']['function']['name']; + // } + Log::info('OpenAI Chat Request' . $suffix, [ + 'parameters' => $parameters, + ]); + + $response = $this->chat->create($parameters); + + Log::info('OpenAI Chat Response' . $suffix, [ + 'response' => [ + 'id' => $response->id, + 'model' => $response->model, + 'created' => $response->created, + 'choices' => array_map(fn($choice) => [ + 'index' => $choice->index, + 'message' => [ + 'role' => $choice->message->role, + 'content' => $choice->message->content, + 'toolCalls' => $choice->message->toolCalls, + ], + 'finishReason' => $choice->finishReason, + ], $response->choices), + 'usage' => [ + 'promptTokens' => $response->usage->promptTokens, + 'completionTokens' => $response->usage->completionTokens, + 'totalTokens' => $response->usage->totalTokens, + ], + ], + ]); + + return $response; + } +} diff --git a/app/Services/OpenAI/OpenAIClientWrapper.php b/app/Services/OpenAI/OpenAIClientWrapper.php new file mode 100644 index 0000000..f6a4055 --- /dev/null +++ b/app/Services/OpenAI/OpenAIClientWrapper.php @@ -0,0 +1,26 @@ +client = $client; + } + + public function chat(): OpenAIChatWrapper + { + return new OpenAIChatWrapper($this->client->chat()); + } + + public function getClient(): Client + { + return $this->client; + } +} diff --git a/app/Services/OpenAIService.php b/app/Services/OpenAIService.php index 0852ad3..fbcb2f1 100644 --- a/app/Services/OpenAIService.php +++ b/app/Services/OpenAIService.php @@ -2,24 +2,24 @@ namespace App\Services; +use App\Services\OpenAI\OpenAIClientWrapper; use OpenAI; class OpenAIService { - private $client; - + private OpenAIClientWrapper $client; public function __construct() { - $this->client = OpenAI::client(getenv('OPENAI_API_KEY')); + $this->client = new OpenAIClientWrapper(OpenAI::client(getenv('OPENAI_API_KEY'))); } - public function getClient() + public function getClient(): OpenAIClientWrapper { return $this->client; } - public function getSmallModel() + public function getSmallModel(): string { return getenv('SMALL_MODEL'); } diff --git a/app/Services/PrismService.php b/app/Services/PrismService.php new file mode 100644 index 0000000..ed3a96a --- /dev/null +++ b/app/Services/PrismService.php @@ -0,0 +1,21 @@ +using(Provider::OpenAI, getenv($this->model)); + } +} diff --git a/app/Services/ProductTranslationService.php b/app/Services/ProductTranslationService.php new file mode 100644 index 0000000..a7ce6ba --- /dev/null +++ b/app/Services/ProductTranslationService.php @@ -0,0 +1,102 @@ +translateList($texts, $targetLocale); + } else { + return $this->translateAssociative($texts, $targetLocale); + } + } + + public function translateString(string $text, string $targetLocale): string + { + $translated = $this->translateList([$text], $targetLocale); + return $translated[0]; + } + + public function translateList(array $texts, string $targetLocale): array + { + $client = $this->openAIService->getClient(); + $response = $this->performListTranslation($client, $texts, $targetLocale); + $translations = json_decode($response->choices[0]->message->content, true); + return $translations['translated'] ?? $texts; + } + + public function translateAssociative(array $texts, string $targetLocale): array + { + $client = $this->openAIService->getClient(); + $response = $this->performAssociativeTranslation($client, $texts, $targetLocale); + $translations = json_decode($response->choices[0]->message->content, true); + return $translations['translated'] ?? $texts; + } + + private function performListTranslation(OpenAIClientWrapper $client, array $texts, string $targetLocale): \OpenAI\Responses\Chat\CreateResponse + { + return $client->chat()->create([ + 'model' => $this->openAIService->getSmallModel(), + 'messages' => [ + [ + 'role' => 'system', + 'content' => "You are a product text translator. Your task is to translate the given array to the specified language. +1. Maintain the marketing style and tone of the original text +2. Return a JSON object with a single field 'translated' containing a numeric array of translated values +3. Keep brand names and trademark symbols (®, ™) unchanged + +Example response format: +{ + \"translated\": [ + \"translated text 1\", + \"translated text 2\" + ] +}" + ], + [ + 'role' => 'user', + 'content' => "Translate these texts to {$targetLocale}:\n\n" . json_encode($texts) + ] + ], + 'response_format' => ['type' => 'json_object'] + ]); + } + + private function performAssociativeTranslation(OpenAIClientWrapper $client, array $texts, string $targetLocale): \OpenAI\Responses\Chat\CreateResponse + { + return $client->chat()->create([ + 'model' => $this->openAIService->getSmallModel(), + 'messages' => [ + [ + 'role' => 'system', + 'content' => "You are a product text translator. Your task is to translate values in the given object. +1. Maintain the marketing style and tone of the original text +2. Return a JSON object with a single field 'translated' containing an object with the same keys but translated values +3. Keep brand names and trademark symbols (®, ™) unchanged + +Example response format: +{ + \"translated\": { + \"key1\": \"translated value 1\", + \"key2\": \"translated value 2\" + } +}" + ], + [ + 'role' => 'user', + 'content' => "Translate these texts to {$targetLocale}:\n\n" . json_encode($texts, JSON_PRETTY_PRINT) + ] + ], + 'response_format' => ['type' => 'json_object'] + ]); + } +} diff --git a/app/Services/ProductTypeClassificationService.php b/app/Services/ProductTypeClassificationService.php new file mode 100644 index 0000000..9d96b20 --- /dev/null +++ b/app/Services/ProductTypeClassificationService.php @@ -0,0 +1,79 @@ +toArray(); + $productTypeName = $this->classifyProductType($sellerProduct->name, $availableTypes); + + if (is_null($productTypeName)) { + throw new \Exception('Product type not found'); + } + + $productType = ProductType::where('name', $productTypeName)->first(); + + // TODO handling in case no product type is found + + return $productType; + } + + private function classifyProductType(string $productName, array $availableTypes): ?string + { + $client = $this->openAIService->getClient(); + + $response = $client->chat()->create([ + 'model' => $this->openAIService->getSmallModel(), + 'messages' => [ + [ + 'role' => 'system', + 'content' => 'You are a product classifier. Given a product name, classify it into one of the available product types. If none match, respond with "n/a".' + ], + [ + 'role' => 'user', + 'content' => "Product name: $productName\nAvailable types: " . implode(', ', $availableTypes) + ] + ], + 'tools' => [ + [ + 'type' => 'function', + 'function' => [ + 'name' => 'classify_product', + 'description' => 'Classify a product into one of the available product types', + 'parameters' => [ + 'type' => 'object', + 'properties' => [ + 'product_type' => [ + 'type' => 'string', + 'enum' => array_merge($availableTypes, ['n/a']), + 'description' => 'The type of product or "n/a" if no type matches' + ] + ], + 'required' => ['product_type'] + ] + ] + ] + ], + 'tool_choice' => ['type' => 'function', 'function' => ['name' => 'classify_product']] + ]); + + $toolCall = $response->choices[0]->message->toolCalls[0]; + $arguments = json_decode($toolCall->function->arguments, true); + + $productType = $arguments['product_type'] ?? null; + if ($productType == 'n/a') { + return null; + } + return $productType; + } +} diff --git a/commands.txt b/commands.txt index ba2b7fd..3830033 100644 --- a/commands.txt +++ b/commands.txt @@ -11,3 +11,6 @@ php artisan make:filament-resource Category --generate php artisan make:filament-resource SellerProduct --generate php artisan make:filament-resource SellerVariant --generate php artisan make:filament-resource Location --generate + + +http://localhost:8000/log-viewer \ No newline at end of file diff --git a/composer.json b/composer.json index 28461f9..45db238 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,8 @@ "mockery/mockery": "^1.6", "nunomaduro/collision": "^8.1", "pestphp/pest": "^3.5", - "pestphp/pest-plugin-laravel": "^3.0" + "pestphp/pest-plugin-laravel": "^3.0", + "opcodesio/log-viewer": "^3.12" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index af3d2ed..dd588e9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "715c7565471a0a766d89c818c8a525cf", + "content-hash": "5c5646a6e83004c8961c734a579d6090", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -8634,6 +8634,147 @@ ], "time": "2024-10-15T16:06:32+00:00" }, + { + "name": "opcodesio/log-viewer", + "version": "v3.12.0", + "source": { + "type": "git", + "url": "https://github.com/opcodesio/log-viewer.git", + "reference": "e9e4c41084be78a07e69924e71f943f366fe31d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opcodesio/log-viewer/zipball/e9e4c41084be78a07e69924e71f943f366fe31d9", + "reference": "e9e4c41084be78a07e69924e71f943f366fe31d9", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0", + "opcodesio/mail-parser": "^0.1.6", + "php": "^8.0" + }, + "conflict": { + "arcanedev/log-viewer": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.2", + "itsgoingd/clockwork": "^5.1", + "laravel/pint": "^1.0", + "nunomaduro/collision": "^7.0|^8.0", + "orchestra/testbench": "^7.6|^8.0|^9.0", + "pestphp/pest": "^2.0", + "pestphp/pest-plugin-laravel": "^2.0", + "spatie/test-time": "^1.3" + }, + "suggest": { + "guzzlehttp/guzzle": "Required for multi-host support. ^7.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Opcodes\\LogViewer\\LogViewerServiceProvider" + ], + "aliases": { + "LogViewer": "Opcodes\\LogViewer\\Facades\\LogViewer" + } + } + }, + "autoload": { + "psr-4": { + "Opcodes\\LogViewer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arunas Skirius", + "email": "arukomp@gmail.com", + "role": "Developer" + } + ], + "description": "Fast and easy-to-use log viewer for your Laravel application", + "homepage": "https://github.com/opcodesio/log-viewer", + "keywords": [ + "arukompas", + "better-log-viewer", + "laravel", + "log viewer", + "logs", + "opcodesio" + ], + "support": { + "issues": "https://github.com/opcodesio/log-viewer/issues", + "source": "https://github.com/opcodesio/log-viewer/tree/v3.12.0" + }, + "funding": [ + { + "url": "https://www.buymeacoffee.com/arunas", + "type": "custom" + }, + { + "url": "https://github.com/arukompas", + "type": "github" + } + ], + "time": "2024-11-11T11:17:46+00:00" + }, + { + "name": "opcodesio/mail-parser", + "version": "v0.1.6", + "source": { + "type": "git", + "url": "https://github.com/opcodesio/mail-parser.git", + "reference": "639ef31cbd146a63416283e75afce152e13233ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opcodesio/mail-parser/zipball/639ef31cbd146a63416283e75afce152e13233ea", + "reference": "639ef31cbd146a63416283e75afce152e13233ea", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "pestphp/pest": "^2.16", + "symfony/var-dumper": "^6.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Opcodes\\MailParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arunas Skirius", + "email": "arukomp@gmail.com", + "role": "Developer" + } + ], + "description": "Parse emails without the mailparse extension", + "keywords": [ + "arukompas", + "email", + "email parser", + "mail", + "opcodesio", + "php" + ], + "support": { + "issues": "https://github.com/opcodesio/mail-parser/issues", + "source": "https://github.com/opcodesio/mail-parser/tree/v0.1.6" + }, + "time": "2023-11-19T08:47:43+00:00" + }, { "name": "pestphp/pest", "version": "v3.6.0", @@ -10902,12 +11043,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.2" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/config/app.php b/config/app.php deleted file mode 100644 index 2e6512c..0000000 --- a/config/app.php +++ /dev/null @@ -1,130 +0,0 @@ - env('APP_NAME', 'Open Source Seller Center'), - - /* - |-------------------------------------------------------------------------- - | Application Environment - |-------------------------------------------------------------------------- - | - | This value determines the "environment" your application is currently - | running in. This may determine how you prefer to configure various - | services the application utilizes. Set this in your ".env" file. - | - */ - - 'env' => env('APP_ENV', 'production'), - - /* - |-------------------------------------------------------------------------- - | Application Debug Mode - |-------------------------------------------------------------------------- - | - | When your application is in debug mode, detailed error messages with - | stack traces will be shown on every error that occurs within your - | application. If disabled, a simple generic error page is shown. - | - */ - - 'debug' => (bool) env('APP_DEBUG', false), - - /* - |-------------------------------------------------------------------------- - | Application URL - |-------------------------------------------------------------------------- - | - | This URL is used by the console to properly generate URLs when using - | the Artisan command line tool. You should set this to the root of - | the application so that it's available within Artisan commands. - | - */ - - 'url' => env('APP_URL', 'http://localhost'), - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | Here you may specify the default timezone for your application, which - | will be used by the PHP date and date-time functions. The timezone - | is set to "UTC" by default as it is suitable for most use cases. - | - */ - - 'timezone' => env('APP_TIMEZONE', 'UTC'), - - /* - |-------------------------------------------------------------------------- - | Application Locale Configuration - |-------------------------------------------------------------------------- - | - | The application locale determines the default locale that will be used - | by Laravel's translation / localization methods. This option can be - | set to any locale for which you plan to have translation strings. - | - */ - - 'locale' => env('APP_LOCALE', 'en'), - - 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), - - 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), - - /* - |-------------------------------------------------------------------------- - | Encryption Key - |-------------------------------------------------------------------------- - | - | This key is utilized by Laravel's encryption services and should be set - | to a random, 32 character string to ensure that all encrypted values - | are secure. You should do this prior to deploying the application. - | - */ - - 'cipher' => 'AES-256-CBC', - - 'key' => env('APP_KEY'), - - 'previous_keys' => [ - ...array_filter( - explode(',', env('APP_PREVIOUS_KEYS', '')) - ), - ], - - /* - |-------------------------------------------------------------------------- - | Maintenance Mode Driver - |-------------------------------------------------------------------------- - | - | These configuration options determine the driver used to determine and - | manage Laravel's "maintenance mode" status. The "cache" driver will - | allow maintenance mode to be controlled across multiple machines. - | - | Supported drivers: "file", "cache" - | - */ - - 'maintenance' => [ - 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), - 'store' => env('APP_MAINTENANCE_STORE', 'database'), - ], - - KEY_DATETIME => 'Y-m-d H:i', - -]; diff --git a/config/auth.php b/config/auth.php deleted file mode 100644 index 0ba5d5d..0000000 --- a/config/auth.php +++ /dev/null @@ -1,115 +0,0 @@ - [ - 'guard' => env('AUTH_GUARD', 'web'), - 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), - ], - - /* - |-------------------------------------------------------------------------- - | Authentication Guards - |-------------------------------------------------------------------------- - | - | Next, you may define every authentication guard for your application. - | Of course, a great default configuration has been defined for you - | which utilizes session storage plus the Eloquent user provider. - | - | All authentication guards have a user provider, which defines how the - | users are actually retrieved out of your database or other storage - | system used by the application. Typically, Eloquent is utilized. - | - | Supported: "session" - | - */ - - 'guards' => [ - 'web' => [ - 'driver' => 'session', - 'provider' => 'users', - ], - ], - - /* - |-------------------------------------------------------------------------- - | User Providers - |-------------------------------------------------------------------------- - | - | All authentication guards have a user provider, which defines how the - | users are actually retrieved out of your database or other storage - | system used by the application. Typically, Eloquent is utilized. - | - | If you have multiple user tables or models you may configure multiple - | providers to represent the model / table. These providers may then - | be assigned to any extra authentication guards you have defined. - | - | Supported: "database", "eloquent" - | - */ - - 'providers' => [ - 'users' => [ - 'driver' => 'eloquent', - 'model' => env('AUTH_MODEL', App\Models\User::class), - ], - - // 'users' => [ - // 'driver' => 'database', - // 'table' => 'users', - // ], - ], - - /* - |-------------------------------------------------------------------------- - | Resetting Passwords - |-------------------------------------------------------------------------- - | - | These configuration options specify the behavior of Laravel's password - | reset functionality, including the table utilized for token storage - | and the user provider that is invoked to actually retrieve users. - | - | The expiry time is the number of minutes that each reset token will be - | considered valid. This security feature keeps tokens short-lived so - | they have less time to be guessed. You may change this as needed. - | - | The throttle setting is the number of seconds a user must wait before - | generating more password reset tokens. This prevents the user from - | quickly generating a very large amount of password reset tokens. - | - */ - - 'passwords' => [ - 'users' => [ - 'provider' => 'users', - 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), - 'expire' => 60, - 'throttle' => 60, - ], - ], - - /* - |-------------------------------------------------------------------------- - | Password Confirmation Timeout - |-------------------------------------------------------------------------- - | - | Here you may define the amount of seconds before a password confirmation - | window expires and users are asked to re-enter their password via the - | confirmation screen. By default, the timeout lasts for three hours. - | - */ - - 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), - -]; diff --git a/config/blueprint.php b/config/blueprint.php deleted file mode 100644 index 59ee1c2..0000000 --- a/config/blueprint.php +++ /dev/null @@ -1,162 +0,0 @@ - 'App', - - /* - |-------------------------------------------------------------------------- - | Component Namespaces - |-------------------------------------------------------------------------- - | - | Blueprint promotes following Laravel conventions. As such, it generates - | components under the default namespaces. For example, models are under - | the `App` namespace. However, you may configure Blueprint to use - | your own custom namespace when generating these components. - | - */ - 'models_namespace' => 'Models', - - 'controllers_namespace' => 'Http\\Controllers', - - 'policy_namespace' => 'Policies', - - /* - |-------------------------------------------------------------------------- - | Application Path - |-------------------------------------------------------------------------- - | - | By default, Blueprint will save the generated application components - | under the files under the `app` folder. However, you may configure - | Blueprint to save these generated component under a custom path. - | - */ - 'app_path' => 'app', - - /* - |-------------------------------------------------------------------------- - | Generate PHPDocs - |-------------------------------------------------------------------------- - | - | Here you may enable generate PHPDocs for classes like Models. This - | not only serves as documentation, but also allows your IDE to - | map to the dynamic properties used by Laravel Models. - | - */ - 'generate_phpdocs' => false, - - /* - |-------------------------------------------------------------------------- - | Foreign Key Constraints - |-------------------------------------------------------------------------- - | - | Here you may enable Blueprint to always add foreign key constraints - | within the generated migration. This will relate these records - | together to add structure and integrity to your database. - | - | In addition, you may specify the action to perform `ON DELETE`. By - | default Blueprint will use `cascade`. However, you may set this - | to 'restrict', 'no_action', or 'null' as well as inline - | by defining your `foreign` key column with an `onDelete`. - | - */ - 'use_constraints' => true, - - 'on_delete' => 'cascade', - - 'on_update' => 'cascade', - - /* - |-------------------------------------------------------------------------- - | Fake Nullables - |-------------------------------------------------------------------------- - | - | By default, Blueprint will set fake data even for nullable columns - | within the generated model factories. However, you may disable - | this behavior if you prefer to only set required columns - | within your model factories. - | - */ - 'fake_nullables' => true, - - /* - |-------------------------------------------------------------------------- - | Use Guarded - |-------------------------------------------------------------------------- - | - | By default, Blueprint will set the `fillable` property within generated - | models with the defined columns. These are set to provide a foundation - | for mass assignment protection provided by Laravel. However, you may - | configure Blueprint to instead set an empty `guarded` property to - | generated "unguarded" models. - | - */ - 'use_guarded' => false, - - /* - |-------------------------------------------------------------------------- - | Singular route names - |-------------------------------------------------------------------------- - | - | By default, Blueprint will `kebab-case` the plural name of the controller - | for the route name. If you would like to ensure a singular route name - | is used for controllers, you may set this to `true`. - | - */ - 'singular_routes' => false, - - /* - |-------------------------------------------------------------------------- - | Constructor Property Promotion - |-------------------------------------------------------------------------- - | - | By default, Blueprint generates class properties explicitly. You may enable - | this option to have Blueprint generate code for classes which contain a - | constructor to set properties with "constructor property promotion". - | - */ - 'property_promotion' => false, - - /* - |-------------------------------------------------------------------------- - | Generators - |-------------------------------------------------------------------------- - | - | Blueprint will automatically register this default array of Generator classes. - | However, you may configure Blueprint to use a custom Generator class to grant - | expanded functionality to Blueprint. - | - | Your custom Generator class MUST implement the 'Blueprint\Contracts\Generator' interface. - | - */ - 'generators' => [ - 'controller' => \Blueprint\Generators\ControllerGenerator::class, - 'factory' => \Blueprint\Generators\FactoryGenerator::class, - 'migration' => \Blueprint\Generators\MigrationGenerator::class, - 'model' => \Blueprint\Generators\ModelGenerator::class, - 'route' => \Blueprint\Generators\RouteGenerator::class, - 'seeder' => \Blueprint\Generators\SeederGenerator::class, - 'test' => \Blueprint\Generators\PhpUnitTestGenerator::class, - // 'test' => \Blueprint\Generators\PestTestGenerator::class, - 'event' => \Blueprint\Generators\Statements\EventGenerator::class, - 'form_request' => \Blueprint\Generators\Statements\FormRequestGenerator::class, - 'job' => \Blueprint\Generators\Statements\JobGenerator::class, - 'mail' => \Blueprint\Generators\Statements\MailGenerator::class, - 'notification' => \Blueprint\Generators\Statements\NotificationGenerator::class, - 'resource' => \Blueprint\Generators\Statements\ResourceGenerator::class, - 'view' => \Blueprint\Generators\Statements\ViewGenerator::class, - 'policy' => \Blueprint\Generators\PolicyGenerator::class, - ], - -]; diff --git a/config/cache.php b/config/cache.php deleted file mode 100644 index 925f7d2..0000000 --- a/config/cache.php +++ /dev/null @@ -1,108 +0,0 @@ - env('CACHE_STORE', 'database'), - - /* - |-------------------------------------------------------------------------- - | Cache Stores - |-------------------------------------------------------------------------- - | - | Here you may define all of the cache "stores" for your application as - | well as their drivers. You may even define multiple stores for the - | same cache driver to group types of items stored in your caches. - | - | Supported drivers: "array", "database", "file", "memcached", - | "redis", "dynamodb", "octane", "null" - | - */ - - 'stores' => [ - - 'array' => [ - 'driver' => 'array', - 'serialize' => false, - ], - - 'database' => [ - 'driver' => 'database', - 'connection' => env('DB_CACHE_CONNECTION'), - 'table' => env('DB_CACHE_TABLE', 'cache'), - 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), - 'lock_table' => env('DB_CACHE_LOCK_TABLE'), - ], - - 'file' => [ - 'driver' => 'file', - 'path' => storage_path('framework/cache/data'), - 'lock_path' => storage_path('framework/cache/data'), - ], - - 'memcached' => [ - 'driver' => 'memcached', - 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), - 'sasl' => [ - env('MEMCACHED_USERNAME'), - env('MEMCACHED_PASSWORD'), - ], - 'options' => [ - // Memcached::OPT_CONNECT_TIMEOUT => 2000, - ], - 'servers' => [ - [ - 'host' => env('MEMCACHED_HOST', '127.0.0.1'), - 'port' => env('MEMCACHED_PORT', 11211), - 'weight' => 100, - ], - ], - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), - 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), - ], - - 'dynamodb' => [ - 'driver' => 'dynamodb', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), - 'endpoint' => env('DYNAMODB_ENDPOINT'), - ], - - 'octane' => [ - 'driver' => 'octane', - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Cache Key Prefix - |-------------------------------------------------------------------------- - | - | When utilizing the APC, database, memcached, Redis, and DynamoDB cache - | stores, there might be other applications using the same cache. For - | that reason, you may prefix every cache key to avoid collisions. - | - */ - - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), - -]; diff --git a/config/database.php b/config/database.php deleted file mode 100644 index 216da97..0000000 --- a/config/database.php +++ /dev/null @@ -1,173 +0,0 @@ - env('DB_CONNECTION', 'sqlite'), - - /* - |-------------------------------------------------------------------------- - | Database Connections - |-------------------------------------------------------------------------- - | - | Below are all of the database connections defined for your application. - | An example configuration is provided for each database system which - | is supported by Laravel. You're free to add / remove connections. - | - */ - - 'connections' => [ - - 'sqlite' => [ - 'driver' => 'sqlite', - 'url' => env('DB_URL'), - 'database' => env('DB_DATABASE', database_path('database.sqlite')), - 'prefix' => '', - 'foreign_key_constraints' => true, - 'busy_timeout' => null, - 'journal_mode' => null, - 'synchronous' => null, - ], - - 'mysql' => [ - 'driver' => 'mysql', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => env('DB_CHARSET', 'utf8mb4'), - 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'mariadb' => [ - 'driver' => 'mariadb', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => env('DB_CHARSET', 'utf8mb4'), - 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'pgsql' => [ - 'driver' => 'pgsql', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => env('DB_CHARSET', 'utf8'), - 'prefix' => '', - 'prefix_indexes' => true, - 'search_path' => 'public', - 'sslmode' => 'prefer', - ], - - 'sqlsrv' => [ - 'driver' => 'sqlsrv', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', 'localhost'), - 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => env('DB_CHARSET', 'utf8'), - 'prefix' => '', - 'prefix_indexes' => true, - // 'encrypt' => env('DB_ENCRYPT', 'yes'), - // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Migration Repository Table - |-------------------------------------------------------------------------- - | - | This table keeps track of all the migrations that have already run for - | your application. Using this information, we can determine which of - | the migrations on disk haven't actually been run on the database. - | - */ - - 'migrations' => [ - 'table' => 'migrations', - 'update_date_on_publish' => true, - ], - - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer body of commands than a typical key-value system - | such as Memcached. You may define your connection settings here. - | - */ - - 'redis' => [ - - 'client' => env('REDIS_CLIENT', 'phpredis'), - - 'options' => [ - 'cluster' => env('REDIS_CLUSTER', 'redis'), - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), - ], - - 'default' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'username' => env('REDIS_USERNAME'), - 'password' => env('REDIS_PASSWORD'), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_DB', '0'), - ], - - 'cache' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'username' => env('REDIS_USERNAME'), - 'password' => env('REDIS_PASSWORD'), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_CACHE_DB', '1'), - ], - - ], - -]; diff --git a/config/filament.php b/config/filament.php deleted file mode 100644 index 65b4bf0..0000000 --- a/config/filament.php +++ /dev/null @@ -1,89 +0,0 @@ - [ - - // 'echo' => [ - // 'broadcaster' => 'pusher', - // 'key' => env('VITE_PUSHER_APP_KEY'), - // 'cluster' => env('VITE_PUSHER_APP_CLUSTER'), - // 'wsHost' => env('VITE_PUSHER_HOST'), - // 'wsPort' => env('VITE_PUSHER_PORT'), - // 'wssPort' => env('VITE_PUSHER_PORT'), - // 'authEndpoint' => '/broadcasting/auth', - // 'disableStats' => true, - // 'encrypted' => true, - // 'forceTLS' => true, - // ], - - ], - - /* - |-------------------------------------------------------------------------- - | Default Filesystem Disk - |-------------------------------------------------------------------------- - | - | This is the storage disk Filament will use to store files. You may use - | any of the disks defined in the `config/filesystems.php`. - | - */ - - 'default_filesystem_disk' => env('FILAMENT_FILESYSTEM_DISK', 'public'), - - /* - |-------------------------------------------------------------------------- - | Assets Path - |-------------------------------------------------------------------------- - | - | This is the directory where Filament's assets will be published to. It - | is relative to the `public` directory of your Laravel application. - | - | After changing the path, you should run `php artisan filament:assets`. - | - */ - - 'assets_path' => null, - - /* - |-------------------------------------------------------------------------- - | Cache Path - |-------------------------------------------------------------------------- - | - | This is the directory that Filament will use to store cache files that - | are used to optimize the registration of components. - | - | After changing the path, you should run `php artisan filament:cache-components`. - | - */ - - 'cache_path' => base_path('bootstrap/cache/filament'), - - /* - |-------------------------------------------------------------------------- - | Livewire Loading Delay - |-------------------------------------------------------------------------- - | - | This sets the delay before loading indicators appear. - | - | Setting this to 'none' makes indicators appear immediately, which can be - | desirable for high-latency connections. Setting it to 'default' applies - | Livewire's standard 200ms delay. - | - */ - - 'livewire_loading_delay' => 'default', - -]; diff --git a/config/filesystems.php b/config/filesystems.php deleted file mode 100644 index b564035..0000000 --- a/config/filesystems.php +++ /dev/null @@ -1,77 +0,0 @@ - env('FILESYSTEM_DISK', 'local'), - - /* - |-------------------------------------------------------------------------- - | Filesystem Disks - |-------------------------------------------------------------------------- - | - | Below you may configure as many filesystem disks as necessary, and you - | may even configure multiple disks for the same driver. Examples for - | most supported storage drivers are configured here for reference. - | - | Supported drivers: "local", "ftp", "sftp", "s3" - | - */ - - 'disks' => [ - - 'local' => [ - 'driver' => 'local', - 'root' => storage_path('app/private'), - 'serve' => true, - 'throw' => false, - ], - - 'public' => [ - 'driver' => 'local', - 'root' => storage_path('app/public'), - 'url' => env('APP_URL').'/storage', - 'visibility' => 'public', - 'throw' => false, - ], - - 's3' => [ - 'driver' => 's3', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION'), - 'bucket' => env('AWS_BUCKET'), - 'url' => env('AWS_URL'), - 'endpoint' => env('AWS_ENDPOINT'), - 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), - 'throw' => false, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Symbolic Links - |-------------------------------------------------------------------------- - | - | Here you may configure the symbolic links that will be created when the - | `storage:link` Artisan command is executed. The array keys should be - | the locations of the links and the values should be their targets. - | - */ - - 'links' => [ - public_path('storage') => storage_path('app/public'), - ], - -]; diff --git a/config/logging.php b/config/logging.php deleted file mode 100644 index 8d94292..0000000 --- a/config/logging.php +++ /dev/null @@ -1,132 +0,0 @@ - env('LOG_CHANNEL', 'stack'), - - /* - |-------------------------------------------------------------------------- - | Deprecations Log Channel - |-------------------------------------------------------------------------- - | - | This option controls the log channel that should be used to log warnings - | regarding deprecated PHP and library features. This allows you to get - | your application ready for upcoming major versions of dependencies. - | - */ - - 'deprecations' => [ - 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), - 'trace' => env('LOG_DEPRECATIONS_TRACE', false), - ], - - /* - |-------------------------------------------------------------------------- - | Log Channels - |-------------------------------------------------------------------------- - | - | Here you may configure the log channels for your application. Laravel - | utilizes the Monolog PHP logging library, which includes a variety - | of powerful log handlers and formatters that you're free to use. - | - | Available drivers: "single", "daily", "slack", "syslog", - | "errorlog", "monolog", "custom", "stack" - | - */ - - 'channels' => [ - - 'stack' => [ - 'driver' => 'stack', - 'channels' => explode(',', env('LOG_STACK', 'single')), - 'ignore_exceptions' => false, - ], - - 'single' => [ - 'driver' => 'single', - 'path' => storage_path('logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'debug'), - 'replace_placeholders' => true, - ], - - 'daily' => [ - 'driver' => 'daily', - 'path' => storage_path('logs/laravel.log'), - 'level' => env('LOG_LEVEL', 'debug'), - 'days' => env('LOG_DAILY_DAYS', 14), - 'replace_placeholders' => true, - ], - - 'slack' => [ - 'driver' => 'slack', - 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), - 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), - 'level' => env('LOG_LEVEL', 'critical'), - 'replace_placeholders' => true, - ], - - 'papertrail' => [ - 'driver' => 'monolog', - 'level' => env('LOG_LEVEL', 'debug'), - 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), - 'handler_with' => [ - 'host' => env('PAPERTRAIL_URL'), - 'port' => env('PAPERTRAIL_PORT'), - 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), - ], - 'processors' => [PsrLogMessageProcessor::class], - ], - - 'stderr' => [ - 'driver' => 'monolog', - 'level' => env('LOG_LEVEL', 'debug'), - 'handler' => StreamHandler::class, - 'formatter' => env('LOG_STDERR_FORMATTER'), - 'with' => [ - 'stream' => 'php://stderr', - ], - 'processors' => [PsrLogMessageProcessor::class], - ], - - 'syslog' => [ - 'driver' => 'syslog', - 'level' => env('LOG_LEVEL', 'debug'), - 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), - 'replace_placeholders' => true, - ], - - 'errorlog' => [ - 'driver' => 'errorlog', - 'level' => env('LOG_LEVEL', 'debug'), - 'replace_placeholders' => true, - ], - - 'null' => [ - 'driver' => 'monolog', - 'handler' => NullHandler::class, - ], - - 'emergency' => [ - 'path' => storage_path('logs/laravel.log'), - ], - - ], - -]; diff --git a/config/mail.php b/config/mail.php deleted file mode 100644 index df13d3d..0000000 --- a/config/mail.php +++ /dev/null @@ -1,116 +0,0 @@ - env('MAIL_MAILER', 'log'), - - /* - |-------------------------------------------------------------------------- - | Mailer Configurations - |-------------------------------------------------------------------------- - | - | Here you may configure all of the mailers used by your application plus - | their respective settings. Several examples have been configured for - | you and you are free to add your own as your application requires. - | - | Laravel supports a variety of mail "transport" drivers that can be used - | when delivering an email. You may specify which one you're using for - | your mailers below. You may also add additional mailers if needed. - | - | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", - | "postmark", "resend", "log", "array", - | "failover", "roundrobin" - | - */ - - 'mailers' => [ - - 'smtp' => [ - 'transport' => 'smtp', - 'url' => env('MAIL_URL'), - 'host' => env('MAIL_HOST', '127.0.0.1'), - 'port' => env('MAIL_PORT', 2525), - 'encryption' => env('MAIL_ENCRYPTION', 'tls'), - 'username' => env('MAIL_USERNAME'), - 'password' => env('MAIL_PASSWORD'), - 'timeout' => null, - 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), - ], - - 'ses' => [ - 'transport' => 'ses', - ], - - 'postmark' => [ - 'transport' => 'postmark', - // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), - // 'client' => [ - // 'timeout' => 5, - // ], - ], - - 'resend' => [ - 'transport' => 'resend', - ], - - 'sendmail' => [ - 'transport' => 'sendmail', - 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), - ], - - 'log' => [ - 'transport' => 'log', - 'channel' => env('MAIL_LOG_CHANNEL'), - ], - - 'array' => [ - 'transport' => 'array', - ], - - 'failover' => [ - 'transport' => 'failover', - 'mailers' => [ - 'smtp', - 'log', - ], - ], - - 'roundrobin' => [ - 'transport' => 'roundrobin', - 'mailers' => [ - 'ses', - 'postmark', - ], - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Global "From" Address - |-------------------------------------------------------------------------- - | - | You may wish for all emails sent by your application to be sent from - | the same address. Here you may specify a name and address that is - | used globally for all emails that are sent by your application. - | - */ - - 'from' => [ - 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), - 'name' => env('MAIL_FROM_NAME', 'Example'), - ], - -]; diff --git a/config/queue.php b/config/queue.php deleted file mode 100644 index 116bd8d..0000000 --- a/config/queue.php +++ /dev/null @@ -1,112 +0,0 @@ - env('QUEUE_CONNECTION', 'database'), - - /* - |-------------------------------------------------------------------------- - | Queue Connections - |-------------------------------------------------------------------------- - | - | Here you may configure the connection options for every queue backend - | used by your application. An example configuration is provided for - | each backend supported by Laravel. You're also free to add more. - | - | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" - | - */ - - 'connections' => [ - - 'sync' => [ - 'driver' => 'sync', - ], - - 'database' => [ - 'driver' => 'database', - 'connection' => env('DB_QUEUE_CONNECTION'), - 'table' => env('DB_QUEUE_TABLE', 'jobs'), - 'queue' => env('DB_QUEUE', 'default'), - 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), - 'after_commit' => false, - ], - - 'beanstalkd' => [ - 'driver' => 'beanstalkd', - 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), - 'queue' => env('BEANSTALKD_QUEUE', 'default'), - 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), - 'block_for' => 0, - 'after_commit' => false, - ], - - 'sqs' => [ - 'driver' => 'sqs', - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), - 'queue' => env('SQS_QUEUE', 'default'), - 'suffix' => env('SQS_SUFFIX'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - 'after_commit' => false, - ], - - 'redis' => [ - 'driver' => 'redis', - 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), - 'queue' => env('REDIS_QUEUE', 'default'), - 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), - 'block_for' => null, - 'after_commit' => false, - ], - - ], - - /* - |-------------------------------------------------------------------------- - | Job Batching - |-------------------------------------------------------------------------- - | - | The following options configure the database and table that store job - | batching information. These options can be updated to any database - | connection and table which has been defined by your application. - | - */ - - 'batching' => [ - 'database' => env('DB_CONNECTION', 'sqlite'), - 'table' => 'job_batches', - ], - - /* - |-------------------------------------------------------------------------- - | Failed Queue Jobs - |-------------------------------------------------------------------------- - | - | These options configure the behavior of failed queue job logging so you - | can control how and where failed jobs are stored. Laravel ships with - | support for storing failed jobs in a simple file or in a database. - | - | Supported drivers: "database-uuids", "dynamodb", "file", "null" - | - */ - - 'failed' => [ - 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), - 'database' => env('DB_CONNECTION', 'sqlite'), - 'table' => 'failed_jobs', - ], - -]; diff --git a/config/services.php b/config/services.php deleted file mode 100644 index 27a3617..0000000 --- a/config/services.php +++ /dev/null @@ -1,38 +0,0 @@ - [ - 'token' => env('POSTMARK_TOKEN'), - ], - - 'ses' => [ - 'key' => env('AWS_ACCESS_KEY_ID'), - 'secret' => env('AWS_SECRET_ACCESS_KEY'), - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), - ], - - 'resend' => [ - 'key' => env('RESEND_KEY'), - ], - - 'slack' => [ - 'notifications' => [ - 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), - 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), - ], - ], - -]; diff --git a/config/session.php b/config/session.php deleted file mode 100644 index f0b6541..0000000 --- a/config/session.php +++ /dev/null @@ -1,217 +0,0 @@ - env('SESSION_DRIVER', 'database'), - - /* - |-------------------------------------------------------------------------- - | Session Lifetime - |-------------------------------------------------------------------------- - | - | Here you may specify the number of minutes that you wish the session - | to be allowed to remain idle before it expires. If you want them - | to expire immediately when the browser is closed then you may - | indicate that via the expire_on_close configuration option. - | - */ - - 'lifetime' => env('SESSION_LIFETIME', 120), - - 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), - - /* - |-------------------------------------------------------------------------- - | Session Encryption - |-------------------------------------------------------------------------- - | - | This option allows you to easily specify that all of your session data - | should be encrypted before it's stored. All encryption is performed - | automatically by Laravel and you may use the session like normal. - | - */ - - 'encrypt' => env('SESSION_ENCRYPT', false), - - /* - |-------------------------------------------------------------------------- - | Session File Location - |-------------------------------------------------------------------------- - | - | When utilizing the "file" session driver, the session files are placed - | on disk. The default storage location is defined here; however, you - | are free to provide another location where they should be stored. - | - */ - - 'files' => storage_path('framework/sessions'), - - /* - |-------------------------------------------------------------------------- - | Session Database Connection - |-------------------------------------------------------------------------- - | - | When using the "database" or "redis" session drivers, you may specify a - | connection that should be used to manage these sessions. This should - | correspond to a connection in your database configuration options. - | - */ - - 'connection' => env('SESSION_CONNECTION'), - - /* - |-------------------------------------------------------------------------- - | Session Database Table - |-------------------------------------------------------------------------- - | - | When using the "database" session driver, you may specify the table to - | be used to store sessions. Of course, a sensible default is defined - | for you; however, you're welcome to change this to another table. - | - */ - - 'table' => env('SESSION_TABLE', 'sessions'), - - /* - |-------------------------------------------------------------------------- - | Session Cache Store - |-------------------------------------------------------------------------- - | - | When using one of the framework's cache driven session backends, you may - | define the cache store which should be used to store the session data - | between requests. This must match one of your defined cache stores. - | - | Affects: "apc", "dynamodb", "memcached", "redis" - | - */ - - 'store' => env('SESSION_STORE'), - - /* - |-------------------------------------------------------------------------- - | Session Sweeping Lottery - |-------------------------------------------------------------------------- - | - | Some session drivers must manually sweep their storage location to get - | rid of old sessions from storage. Here are the chances that it will - | happen on a given request. By default, the odds are 2 out of 100. - | - */ - - 'lottery' => [2, 100], - - /* - |-------------------------------------------------------------------------- - | Session Cookie Name - |-------------------------------------------------------------------------- - | - | Here you may change the name of the session cookie that is created by - | the framework. Typically, you should not need to change this value - | since doing so does not grant a meaningful security improvement. - | - */ - - 'cookie' => env( - 'SESSION_COOKIE', - Str::slug(env('APP_NAME', 'laravel'), '_').'_session' - ), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Path - |-------------------------------------------------------------------------- - | - | The session cookie path determines the path for which the cookie will - | be regarded as available. Typically, this will be the root path of - | your application, but you're free to change this when necessary. - | - */ - - 'path' => env('SESSION_PATH', '/'), - - /* - |-------------------------------------------------------------------------- - | Session Cookie Domain - |-------------------------------------------------------------------------- - | - | This value determines the domain and subdomains the session cookie is - | available to. By default, the cookie will be available to the root - | domain and all subdomains. Typically, this shouldn't be changed. - | - */ - - 'domain' => env('SESSION_DOMAIN'), - - /* - |-------------------------------------------------------------------------- - | HTTPS Only Cookies - |-------------------------------------------------------------------------- - | - | By setting this option to true, session cookies will only be sent back - | to the server if the browser has a HTTPS connection. This will keep - | the cookie from being sent to you when it can't be done securely. - | - */ - - 'secure' => env('SESSION_SECURE_COOKIE'), - - /* - |-------------------------------------------------------------------------- - | HTTP Access Only - |-------------------------------------------------------------------------- - | - | Setting this value to true will prevent JavaScript from accessing the - | value of the cookie and the cookie will only be accessible through - | the HTTP protocol. It's unlikely you should disable this option. - | - */ - - 'http_only' => env('SESSION_HTTP_ONLY', true), - - /* - |-------------------------------------------------------------------------- - | Same-Site Cookies - |-------------------------------------------------------------------------- - | - | This option determines how your cookies behave when cross-site requests - | take place, and can be used to mitigate CSRF attacks. By default, we - | will set this value to "lax" to permit secure cross-site requests. - | - | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value - | - | Supported: "lax", "strict", "none", null - | - */ - - 'same_site' => env('SESSION_SAME_SITE', 'lax'), - - /* - |-------------------------------------------------------------------------- - | Partitioned Cookies - |-------------------------------------------------------------------------- - | - | Setting this value to true will tie the cookie to the top-level site for - | a cross-site context. Partitioned cookies are accepted by the browser - | when flagged "secure" and the Same-Site attribute is set to "none". - | - */ - - 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), - -]; diff --git a/database/dbschema.dbs b/database/dbschema.dbs new file mode 100644 index 0000000..659bb78 --- /dev/null +++ b/database/dbschema.dbs @@ -0,0 +1,801 @@ + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/database/dbschema.dbs.bak b/database/dbschema.dbs.bak new file mode 100644 index 0000000..bc79474 --- /dev/null +++ b/database/dbschema.dbs.bak @@ -0,0 +1,795 @@ + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/database/factories/GoldenProductAttributeFactory.php b/database/factories/GoldenProductAttributeFactory.php new file mode 100644 index 0000000..119ab75 --- /dev/null +++ b/database/factories/GoldenProductAttributeFactory.php @@ -0,0 +1,31 @@ + ProductTypeAttribute::factory(), + 'golden_product_id' => GoldenProduct::factory(), + 'is_option' => $this->faker->boolean(), + ]; + } +} diff --git a/database/factories/GoldenProductAttributeValueFactory.php b/database/factories/GoldenProductAttributeValueFactory.php new file mode 100644 index 0000000..da576ab --- /dev/null +++ b/database/factories/GoldenProductAttributeValueFactory.php @@ -0,0 +1,31 @@ + $this->faker->word(), + 'golden_product_attribute_id' => GoldenProductAttribute::factory(), + 'locale_id' => Locale::factory(), + ]; + } +} diff --git a/database/factories/GoldenProductImageFactory.php b/database/factories/GoldenProductImageFactory.php new file mode 100644 index 0000000..fde92cb --- /dev/null +++ b/database/factories/GoldenProductImageFactory.php @@ -0,0 +1,32 @@ + GoldenProduct::factory(), + 'image' => $this->faker->word(), + 'number' => $this->faker->numberBetween(-10000, 10000), + 'seller_product_image_id' => SellerProductImage::factory(), + ]; + } +} diff --git a/database/factories/ProductTypeAttributeFactory.php b/database/factories/ProductTypeAttributeFactory.php index b302940..8e8d209 100644 --- a/database/factories/ProductTypeAttributeFactory.php +++ b/database/factories/ProductTypeAttributeFactory.php @@ -23,6 +23,7 @@ public function definition(): array { return [ 'name' => $this->faker->name(), + 'slug' => $this->faker->slug(), 'type' => $this->faker->randomElement(["text","boolean","number","select","url","color"]), 'is_translatable' => $this->faker->boolean(), 'field' => $this->faker->randomElement(["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]), @@ -31,7 +32,6 @@ public function definition(): array 'description' => $this->faker->text(), 'unit' => $this->faker->word(), 'is_variant_attribute' => $this->faker->boolean(), - 'options' => '{}', 'validators' => '{}', 'product_type_id' => ProductType::factory(), ]; diff --git a/database/factories/ProductTypeAttributeOptionFactory.php b/database/factories/ProductTypeAttributeOptionFactory.php new file mode 100644 index 0000000..4fcfc73 --- /dev/null +++ b/database/factories/ProductTypeAttributeOptionFactory.php @@ -0,0 +1,28 @@ + ProductTypeAttribute::factory(), + ]; + } +} diff --git a/database/factories/ProductTypeAttributeOptionValueFactory.php b/database/factories/ProductTypeAttributeOptionValueFactory.php new file mode 100644 index 0000000..d8f08d3 --- /dev/null +++ b/database/factories/ProductTypeAttributeOptionValueFactory.php @@ -0,0 +1,31 @@ + $this->faker->word(), + 'locale_id' => Locale::factory(), + 'product_type_attribute_option_id' => ProductTypeAttributeOption::factory(), + ]; + } +} diff --git a/database/migrations/2024_12_04_172849_create_sellers_table.php b/database/migrations/2024_12_11_153010_create_sellers_table.php similarity index 100% rename from database/migrations/2024_12_04_172849_create_sellers_table.php rename to database/migrations/2024_12_11_153010_create_sellers_table.php diff --git a/database/migrations/2024_12_04_172850_create_partnerships_table.php b/database/migrations/2024_12_11_153011_create_partnerships_table.php similarity index 90% rename from database/migrations/2024_12_04_172850_create_partnerships_table.php rename to database/migrations/2024_12_11_153011_create_partnerships_table.php index 0ee0a49..4e43867 100644 --- a/database/migrations/2024_12_04_172850_create_partnerships_table.php +++ b/database/migrations/2024_12_11_153011_create_partnerships_table.php @@ -15,7 +15,7 @@ public function up(): void Schema::create('partnerships', function (Blueprint $table) { $table->id(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained(); $table->enum('status', ["submitted","accepted","rejected","review"])->default('submitted'); $table->text('rejection_reason')->nullable(); $table->text('notes')->nullable(); diff --git a/database/migrations/2024_12_04_172851_create_seller_data_table.php b/database/migrations/2024_12_11_153012_create_seller_data_table.php similarity index 94% rename from database/migrations/2024_12_04_172851_create_seller_data_table.php rename to database/migrations/2024_12_11_153012_create_seller_data_table.php index d87cc30..af9eb51 100644 --- a/database/migrations/2024_12_04_172851_create_seller_data_table.php +++ b/database/migrations/2024_12_11_153012_create_seller_data_table.php @@ -15,7 +15,7 @@ public function up(): void Schema::create('seller_data', function (Blueprint $table) { $table->id(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained(); $table->string('email')->nullable(); $table->text('description')->nullable(); $table->string('company_name')->nullable(); diff --git a/database/migrations/2024_12_04_172852_create_categories_table.php b/database/migrations/2024_12_11_153013_create_categories_table.php similarity index 93% rename from database/migrations/2024_12_04_172852_create_categories_table.php rename to database/migrations/2024_12_11_153013_create_categories_table.php index 5aacc7b..58e2b8e 100644 --- a/database/migrations/2024_12_04_172852_create_categories_table.php +++ b/database/migrations/2024_12_11_153013_create_categories_table.php @@ -18,7 +18,7 @@ public function up(): void $table->string('name'); $table->text('description')->nullable(); $table->boolean('is_active')->nullable(); - $table->foreignId('parent_id')->nullable()->constrained('categories')->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('parent_id')->nullable()->constrained('categories'); $table->timestamps(); }); diff --git a/database/migrations/2024_12_04_172853_create_seller_products_table.php b/database/migrations/2024_12_11_153014_create_seller_products_table.php similarity index 87% rename from database/migrations/2024_12_04_172853_create_seller_products_table.php rename to database/migrations/2024_12_11_153014_create_seller_products_table.php index 768dd76..b2090c6 100644 --- a/database/migrations/2024_12_04_172853_create_seller_products_table.php +++ b/database/migrations/2024_12_11_153014_create_seller_products_table.php @@ -20,15 +20,15 @@ public function up(): void $table->string('sku')->nullable(); $table->text('description')->nullable(); $table->json('attributes')->nullable(); - $table->foreignId('category_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('category_id')->nullable()->constrained(); + $table->foreignId('seller_id')->constrained(); $table->enum('status', ["draft","active","delisted"])->default('draft'); $table->boolean('selected')->default(false); $table->string('ean')->nullable(); $table->string('upc')->nullable(); $table->string('gtin_14')->nullable(); $table->string('gtin_8')->nullable(); - $table->foreignId('golden_product_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('golden_product_id')->nullable()->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_04_172854_create_seller_product_images_table.php b/database/migrations/2024_12_11_153015_create_seller_product_images_table.php similarity index 90% rename from database/migrations/2024_12_04_172854_create_seller_product_images_table.php rename to database/migrations/2024_12_11_153015_create_seller_product_images_table.php index fc04f51..10dae2f 100644 --- a/database/migrations/2024_12_04_172854_create_seller_product_images_table.php +++ b/database/migrations/2024_12_11_153015_create_seller_product_images_table.php @@ -15,8 +15,8 @@ public function up(): void Schema::create('seller_product_images', function (Blueprint $table) { $table->id(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_product_id')->constrained(); + $table->foreignId('seller_variant_id')->nullable()->constrained(); $table->string('image'); $table->integer('number')->default(1); $table->timestamps(); diff --git a/database/migrations/2024_12_04_172855_create_seller_variants_table.php b/database/migrations/2024_12_11_153016_create_seller_variants_table.php similarity index 87% rename from database/migrations/2024_12_04_172855_create_seller_variants_table.php rename to database/migrations/2024_12_11_153016_create_seller_variants_table.php index aa8f820..3c1d19c 100644 --- a/database/migrations/2024_12_04_172855_create_seller_variants_table.php +++ b/database/migrations/2024_12_11_153016_create_seller_variants_table.php @@ -19,8 +19,8 @@ public function up(): void $table->string('sku')->nullable(); $table->text('description')->nullable(); $table->json('attributes')->nullable(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_product_id')->constrained(); + $table->foreignId('seller_id')->constrained(); $table->enum('status', ["draft","active","delisted"])->default('draft'); $table->timestamps(); }); diff --git a/database/migrations/2024_12_04_172856_create_prices_table.php b/database/migrations/2024_12_11_153017_create_prices_table.php similarity index 80% rename from database/migrations/2024_12_04_172856_create_prices_table.php rename to database/migrations/2024_12_11_153017_create_prices_table.php index cf72b6a..3b5ab16 100644 --- a/database/migrations/2024_12_04_172856_create_prices_table.php +++ b/database/migrations/2024_12_11_153017_create_prices_table.php @@ -16,9 +16,9 @@ public function up(): void Schema::create('prices', function (Blueprint $table) { $table->id(); $table->integer('amount'); - $table->foreignId('seller_variant_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('currency_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_variant_id')->nullable()->constrained(); + $table->foreignId('seller_product_id')->constrained(); + $table->foreignId('currency_id')->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_04_172857_create_stocks_table.php b/database/migrations/2024_12_11_153018_create_stocks_table.php similarity index 76% rename from database/migrations/2024_12_04_172857_create_stocks_table.php rename to database/migrations/2024_12_11_153018_create_stocks_table.php index 17b09e8..2eb6c60 100644 --- a/database/migrations/2024_12_04_172857_create_stocks_table.php +++ b/database/migrations/2024_12_11_153018_create_stocks_table.php @@ -18,10 +18,10 @@ public function up(): void $table->integer('quantity'); $table->integer('reserved')->nullable(); $table->integer('safety_stock')->nullable(); - $table->foreignId('seller_variant_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('location_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_variant_id')->constrained(); + $table->foreignId('seller_product_id')->constrained(); + $table->foreignId('location_id')->constrained(); + $table->foreignId('seller_id')->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_04_172858_create_locations_table.php b/database/migrations/2024_12_11_153019_create_locations_table.php similarity index 88% rename from database/migrations/2024_12_04_172858_create_locations_table.php rename to database/migrations/2024_12_11_153019_create_locations_table.php index c643177..00905b2 100644 --- a/database/migrations/2024_12_04_172858_create_locations_table.php +++ b/database/migrations/2024_12_11_153019_create_locations_table.php @@ -18,7 +18,7 @@ public function up(): void $table->string('name'); $table->string('address'); $table->integer('default_delivery_days')->nullable(); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_04_172859_create_currencies_table.php b/database/migrations/2024_12_11_153020_create_currencies_table.php similarity index 100% rename from database/migrations/2024_12_04_172859_create_currencies_table.php rename to database/migrations/2024_12_11_153020_create_currencies_table.php diff --git a/database/migrations/2024_12_04_172900_create_messages_table.php b/database/migrations/2024_12_11_153021_create_messages_table.php similarity index 83% rename from database/migrations/2024_12_04_172900_create_messages_table.php rename to database/migrations/2024_12_11_153021_create_messages_table.php index b37b7ca..83efcba 100644 --- a/database/migrations/2024_12_04_172900_create_messages_table.php +++ b/database/migrations/2024_12_11_153021_create_messages_table.php @@ -16,8 +16,8 @@ public function up(): void Schema::create('messages', function (Blueprint $table) { $table->id(); $table->text('content'); - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('message_id')->nullable()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id')->constrained(); + $table->foreignId('message_id')->nullable()->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_04_172901_create_product_types_table.php b/database/migrations/2024_12_11_153022_create_product_types_table.php similarity index 100% rename from database/migrations/2024_12_04_172901_create_product_types_table.php rename to database/migrations/2024_12_11_153022_create_product_types_table.php diff --git a/database/migrations/2024_12_04_172902_create_product_type_attributes_table.php b/database/migrations/2024_12_11_153023_create_product_type_attributes_table.php similarity index 89% rename from database/migrations/2024_12_04_172902_create_product_type_attributes_table.php rename to database/migrations/2024_12_11_153023_create_product_type_attributes_table.php index 19c0375..c3d1ac7 100644 --- a/database/migrations/2024_12_04_172902_create_product_type_attributes_table.php +++ b/database/migrations/2024_12_11_153023_create_product_type_attributes_table.php @@ -16,6 +16,7 @@ public function up(): void Schema::create('product_type_attributes', function (Blueprint $table) { $table->id(); $table->string('name'); + $table->string('slug'); $table->enum('type', ["text","boolean","number","select","url","color"]); $table->boolean('is_translatable')->default(false); $table->enum('field', ["TextInput","Textarea","Checkbox","Toggle","Select","ColorPicker"]); @@ -24,9 +25,8 @@ public function up(): void $table->string('description')->nullable(); $table->string('unit')->nullable(); $table->boolean('is_variant_attribute')->default(false); - $table->json('options')->nullable(); $table->json('validators')->nullable(); - $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('product_type_id')->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_11_153024_create_product_type_attribute_options_table.php b/database/migrations/2024_12_11_153024_create_product_type_attribute_options_table.php new file mode 100644 index 0000000..d6ad32a --- /dev/null +++ b/database/migrations/2024_12_11_153024_create_product_type_attribute_options_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('product_type_attribute_id')->constrained(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_type_attribute_options'); + } +}; diff --git a/database/migrations/2024_12_11_153025_create_product_type_attribute_option_values_table.php b/database/migrations/2024_12_11_153025_create_product_type_attribute_option_values_table.php new file mode 100644 index 0000000..55dfc84 --- /dev/null +++ b/database/migrations/2024_12_11_153025_create_product_type_attribute_option_values_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('value'); + $table->foreignId('locale_id')->constrained(); + $table->foreignId('product_type_attribute_option_id')->constrained(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_type_attribute_option_values'); + } +}; diff --git a/database/migrations/2024_12_04_172903_create_golden_products_table.php b/database/migrations/2024_12_11_153026_create_golden_products_table.php similarity index 86% rename from database/migrations/2024_12_04_172903_create_golden_products_table.php rename to database/migrations/2024_12_11_153026_create_golden_products_table.php index aa1610f..4f4d3bc 100644 --- a/database/migrations/2024_12_04_172903_create_golden_products_table.php +++ b/database/migrations/2024_12_11_153026_create_golden_products_table.php @@ -15,7 +15,7 @@ public function up(): void Schema::create('golden_products', function (Blueprint $table) { $table->id(); - $table->foreignId('product_type_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('product_type_id')->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_11_153027_create_golden_product_attributes_table.php b/database/migrations/2024_12_11_153027_create_golden_product_attributes_table.php new file mode 100644 index 0000000..20fa1dd --- /dev/null +++ b/database/migrations/2024_12_11_153027_create_golden_product_attributes_table.php @@ -0,0 +1,34 @@ +id(); + $table->foreignId('product_type_attribute_id')->constrained(); + $table->foreignId('golden_product_id')->constrained(); + $table->boolean('is_option')->default(false); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_product_attributes'); + } +}; diff --git a/database/migrations/2024_12_11_153028_create_golden_product_attribute_values_table.php b/database/migrations/2024_12_11_153028_create_golden_product_attribute_values_table.php new file mode 100644 index 0000000..d538729 --- /dev/null +++ b/database/migrations/2024_12_11_153028_create_golden_product_attribute_values_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('value'); + $table->foreignId('golden_product_attribute_id')->constrained(); + $table->foreignId('locale_id')->constrained(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_product_attribute_values'); + } +}; diff --git a/database/migrations/2024_12_04_172904_create_golden_product_localizeds_table.php b/database/migrations/2024_12_11_153029_create_golden_product_localizeds_table.php similarity index 86% rename from database/migrations/2024_12_04_172904_create_golden_product_localizeds_table.php rename to database/migrations/2024_12_11_153029_create_golden_product_localizeds_table.php index 51f8eb9..352b273 100644 --- a/database/migrations/2024_12_04_172904_create_golden_product_localizeds_table.php +++ b/database/migrations/2024_12_11_153029_create_golden_product_localizeds_table.php @@ -18,8 +18,8 @@ public function up(): void $table->string('name'); $table->text('description')->nullable(); $table->json('attributes')->nullable(); - $table->foreignId('locale_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('golden_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('locale_id')->constrained(); + $table->foreignId('golden_product_id')->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_04_172905_create_golden_product_variants_table.php b/database/migrations/2024_12_11_153030_create_golden_product_variants_table.php similarity index 94% rename from database/migrations/2024_12_04_172905_create_golden_product_variants_table.php rename to database/migrations/2024_12_11_153030_create_golden_product_variants_table.php index 2a3ebc1..930d010 100644 --- a/database/migrations/2024_12_04_172905_create_golden_product_variants_table.php +++ b/database/migrations/2024_12_11_153030_create_golden_product_variants_table.php @@ -15,7 +15,7 @@ public function up(): void Schema::create('golden_product_variants', function (Blueprint $table) { $table->id(); - $table->foreignId('golden_product_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('golden_product_id')->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_04_172906_create_golden_product_variant_localizeds_table.php b/database/migrations/2024_12_11_153031_create_golden_product_variant_localizeds_table.php similarity index 86% rename from database/migrations/2024_12_04_172906_create_golden_product_variant_localizeds_table.php rename to database/migrations/2024_12_11_153031_create_golden_product_variant_localizeds_table.php index 8e2cfd1..b0ff84b 100644 --- a/database/migrations/2024_12_04_172906_create_golden_product_variant_localizeds_table.php +++ b/database/migrations/2024_12_11_153031_create_golden_product_variant_localizeds_table.php @@ -18,8 +18,8 @@ public function up(): void $table->string('name')->nullable(); $table->text('description')->nullable(); $table->json('attributes')->nullable(); - $table->foreignId('golden_product_variant_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('locale_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('golden_product_variant_id')->constrained(); + $table->foreignId('locale_id')->constrained(); $table->timestamps(); }); diff --git a/database/migrations/2024_12_11_153032_create_golden_product_images_table.php b/database/migrations/2024_12_11_153032_create_golden_product_images_table.php new file mode 100644 index 0000000..fc3de6d --- /dev/null +++ b/database/migrations/2024_12_11_153032_create_golden_product_images_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('golden_product_id')->constrained(); + $table->string('image'); + $table->integer('number')->default(1); + $table->foreignId('seller_product_image_id')->constrained(); + $table->timestamps(); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_product_images'); + } +}; diff --git a/database/migrations/2024_12_04_172907_create_locales_table.php b/database/migrations/2024_12_11_153033_create_locales_table.php similarity index 100% rename from database/migrations/2024_12_04_172907_create_locales_table.php rename to database/migrations/2024_12_11_153033_create_locales_table.php diff --git a/database/migrations/2024_12_04_172908_create_seller_user_table.php b/database/migrations/2024_12_11_153034_create_seller_user_table.php similarity index 62% rename from database/migrations/2024_12_04_172908_create_seller_user_table.php rename to database/migrations/2024_12_11_153034_create_seller_user_table.php index b124774..4757553 100644 --- a/database/migrations/2024_12_04_172908_create_seller_user_table.php +++ b/database/migrations/2024_12_11_153034_create_seller_user_table.php @@ -11,14 +11,10 @@ */ public function up(): void { - Schema::disableForeignKeyConstraints(); - Schema::create('seller_user', function (Blueprint $table) { - $table->foreignId('seller_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); - $table->foreignId('user_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignId('seller_id'); + $table->foreignId('user_id'); }); - - Schema::enableForeignKeyConstraints(); } /** diff --git a/database/migrations/2024_12_11_153035_create_golden_product_attribute_product_type_attribute_option_value_table.php b/database/migrations/2024_12_11_153035_create_golden_product_attribute_product_type_attribute_option_value_table.php new file mode 100644 index 0000000..f77703c --- /dev/null +++ b/database/migrations/2024_12_11_153035_create_golden_product_attribute_product_type_attribute_option_value_table.php @@ -0,0 +1,31 @@ +foreignId('golden_product_attribute_id'); + $table->foreignId('product_type_attribute_option_value_id'); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('golden_product_attribute_product_type_attribute_option_value'); + } +}; diff --git a/database/migrations/2024_12_11_153036_create_optionValue_table.php b/database/migrations/2024_12_11_153036_create_optionValue_table.php new file mode 100644 index 0000000..51d8b8c --- /dev/null +++ b/database/migrations/2024_12_11_153036_create_optionValue_table.php @@ -0,0 +1,31 @@ +foreignId('golden_product_attribute_id'); + $table->foreignId('product_type_attribute_option_value_id'); + }); + + Schema::enableForeignKeyConstraints(); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('optionValue'); + } +}; diff --git a/database/seeders/AttributeSeeder.php b/database/seeders/AttributeSeeder.php index 83b84db..5f972e9 100644 --- a/database/seeders/AttributeSeeder.php +++ b/database/seeders/AttributeSeeder.php @@ -2,148 +2,846 @@ namespace Database\Seeders; +use App\Models\Locale; use App\Models\ProductType; +use App\Models\ProductTypeAttribute; +use App\Models\ProductTypeAttributeOption; +use App\Models\ProductTypeAttributeOptionValue; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\Log; +use Illuminate\Support\Str; class AttributeSeeder extends Seeder { public function run(): void { + $locales = Locale::all(); + if ($locales->isEmpty()) { + Log::error('No locales found in the database. Make sure LocaleSeeder has been run.'); + return; + } + $attributesByType = [ 'Sneakers' => [ [ - 'name' => 'material', + 'name' => 'Material', + 'slug' => 'material', 'type' => 'select', 'field' => 'Select', 'required' => true, + 'is_translatable' => true, 'options' => [ - ['label' => 'Leather', 'value' => 'leather'], - ['label' => 'Canvas', 'value' => 'canvas'], - ['label' => 'Synthetic', 'value' => 'synthetic'], - ['label' => 'Mesh', 'value' => 'mesh'], - ['label' => 'Suede', 'value' => 'suede'] - ], - 'description' => 'Main material of the sneaker' + [ + 'translations' => [ + 'en' => 'Leather', + 'de' => 'Leder', + 'fr' => 'Cuir' + ] + ], + [ + 'translations' => [ + 'en' => 'Canvas', + 'de' => 'Leinen', + 'fr' => 'Toile' + ] + ], + [ + 'translations' => [ + 'en' => 'Synthetic', + 'de' => 'Synthetisch', + 'fr' => 'Synthétique' + ] + ], + [ + 'translations' => [ + 'en' => 'Mesh', + 'de' => 'Mesh', + 'fr' => 'Maille' + ] + ], + [ + 'translations' => [ + 'en' => 'Suede', + 'de' => 'Wildleder', + 'fr' => 'Daim' + ] + ], + [ + 'translations' => [ + 'en' => 'Knit', + 'de' => 'Strick', + 'fr' => 'Tricot' + ] + ] + ] ], [ - 'name' => 'is_waterproof', + 'name' => 'Is Waterproof', 'type' => 'boolean', 'field' => 'Toggle', + 'required' => true + ], + [ + 'name' => 'Style', + 'slug' => 'style', + 'type' => 'select', + 'field' => 'Select', 'required' => true, - 'description' => 'Whether the sneaker is waterproof' + 'is_translatable' => false, + 'options' => [ + [ + 'translations' => [ + 'en' => 'Athletic', + 'de' => 'Athletic', + 'fr' => 'Athletic' + ] + ], + [ + 'translations' => [ + 'en' => 'Casual', + 'de' => 'Casual', + 'fr' => 'Casual' + ] + ], + [ + 'translations' => [ + 'en' => 'Lifestyle', + 'de' => 'Lifestyle', + 'fr' => 'Lifestyle' + ] + ], + [ + 'translations' => [ + 'en' => 'Running', + 'de' => 'Running', + 'fr' => 'Running' + ] + ], + [ + 'translations' => [ + 'en' => 'Basketball', + 'de' => 'Basketball', + 'fr' => 'Basketball' + ] + ], + [ + 'translations' => [ + 'en' => 'Skateboarding', + 'de' => 'Skateboarding', + 'fr' => 'Skateboarding' + ] + ] + ] ], [ - 'name' => 'product_description', - 'type' => 'text', - 'field' => 'Textarea', - 'required' => false, - 'description' => 'Detailed product description with formatting' + 'name' => 'Closure Type', + 'slug' => 'closure-type', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'is_translatable' => true, + 'options' => [ + [ + 'translations' => [ + 'en' => 'Lace-up', + 'de' => 'Schnürsenkel', + 'fr' => 'Lacets' + ] + ], + [ + 'translations' => [ + 'en' => 'Slip-on', + 'de' => 'Schlupfschuh', + 'fr' => 'Sans lacets' + ] + ], + [ + 'translations' => [ + 'en' => 'Velcro', + 'de' => 'Klettverschluss', + 'fr' => 'Velcro' + ] + ], + [ + 'translations' => [ + 'en' => 'Zip', + 'de' => 'Reißverschluss', + 'fr' => 'Fermeture éclair' + ] + ], + [ + 'translations' => [ + 'en' => 'BOA System', + 'de' => 'BOA System', + 'fr' => 'Système BOA' + ] + ] + ] + ], + [ + 'name' => 'Main Color', + 'type' => 'color', + 'field' => 'ColorPicker', + 'required' => true ] ], 'T-Shirt' => [ [ - 'name' => 'fabric_composition', - 'type' => 'text', - 'field' => 'TextInput', + 'name' => 'Fabric', + 'slug' => 'fabric', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'is_translatable' => true, + 'options' => [ + [ + 'translations' => [ + 'en' => '100% Cotton', + 'de' => '100% Baumwolle', + 'fr' => '100% Coton' + ] + ], + [ + 'translations' => [ + 'en' => 'Cotton Blend', + 'de' => 'Baumwollmischung', + 'fr' => 'Mélange de coton' + ] + ], + [ + 'translations' => [ + 'en' => 'Polyester', + 'de' => 'Polyester', + 'fr' => 'Polyester' + ] + ], + [ + 'translations' => [ + 'en' => 'Modal', + 'de' => 'Modal', + 'fr' => 'Modal' + ] + ], + [ + 'translations' => [ + 'en' => 'Bamboo', + 'de' => 'Bambus', + 'fr' => 'Bambou' + ] + ], + [ + 'translations' => [ + 'en' => 'Merino Wool', + 'de' => 'Merinowolle', + 'fr' => 'Laine mérinos' + ] + ] + ] + ], + [ + 'name' => 'Neckline', + 'slug' => 'neckline', + 'type' => 'select', + 'field' => 'Select', 'required' => true, - 'description' => 'Material composition (e.g., "100% Cotton")' + 'is_translatable' => false, + 'options' => [ + [ + 'translations' => [ + 'en' => 'Crew Neck', + 'de' => 'Crew Neck', + 'fr' => 'Crew Neck' + ] + ], + [ + 'translations' => [ + 'en' => 'V-Neck', + 'de' => 'V-Neck', + 'fr' => 'V-Neck' + ] + ], + [ + 'translations' => [ + 'en' => 'Scoop Neck', + 'de' => 'Scoop Neck', + 'fr' => 'Scoop Neck' + ] + ], + [ + 'translations' => [ + 'en' => 'Henley', + 'de' => 'Henley', + 'fr' => 'Henley' + ] + ], + [ + 'translations' => [ + 'en' => 'Polo', + 'de' => 'Polo', + 'fr' => 'Polo' + ] + ] + ] ], [ - 'name' => 'style_categories', + 'name' => 'Sleeve Type', + 'slug' => 'sleeve-type', 'type' => 'select', 'field' => 'Select', 'required' => true, + 'is_translatable' => true, 'options' => [ - ['label' => 'Casual', 'value' => 'casual'], - ['label' => 'Sport', 'value' => 'sport'], - ['label' => 'Streetwear', 'value' => 'streetwear'], - ['label' => 'Business', 'value' => 'business'] - ], - 'description' => 'Style categories this shirt belongs to' + [ + 'translations' => [ + 'en' => 'Sleeveless', + 'de' => 'Ärmellos', + 'fr' => 'Sans manches' + ] + ], + [ + 'translations' => [ + 'en' => 'Cap Sleeve', + 'de' => 'Kurzarm', + 'fr' => 'Manche courte' + ] + ], + [ + 'translations' => [ + 'en' => 'Short Sleeve', + 'de' => 'Kurzarm', + 'fr' => 'Manche courte' + ] + ], + [ + 'translations' => [ + 'en' => 'Long Sleeve', + 'de' => 'Langarm', + 'fr' => 'Manche longue' + ] + ], + [ + 'translations' => [ + 'en' => 'Bell Sleeve', + 'de' => 'Glockenärmel', + 'fr' => 'Manche cloche' + ] + ], + [ + 'translations' => [ + 'en' => 'Flutter Sleeve', + 'de' => 'Flatterärmel', + 'fr' => 'Manche papillon' + ] + ] + ] ], [ - 'name' => 'is_sustainable', + 'name' => 'Is Sustainable', 'type' => 'boolean', - 'field' => 'Checkbox', + 'field' => 'Toggle', + 'required' => false + ], + [ + 'name' => 'Print Type', + 'slug' => 'print-type', + 'type' => 'select', + 'field' => 'Select', 'required' => false, - 'description' => 'Made with sustainable materials/processes' + 'is_translatable' => true, + 'options' => [ + [ + 'translations' => [ + 'en' => 'Screen Print', + 'de' => 'Siebdruck', + 'fr' => 'Sérigraphie' + ] + ], + [ + 'translations' => [ + 'en' => 'Digital Print', + 'de' => 'Digitaldruck', + 'fr' => 'Impression numérique' + ] + ], + [ + 'translations' => [ + 'en' => 'Embroidery', + 'de' => 'Stickerei', + 'fr' => 'Broderie' + ] + ], + [ + 'translations' => [ + 'en' => 'Heat Transfer', + 'de' => 'Wärmeübertragung', + 'fr' => 'Transfert thermique' + ] + ], + [ + 'translations' => [ + 'en' => 'No Print', + 'de' => 'Kein Druck', + 'fr' => 'Sans impression' + ] + ] + ] ] ], 'Jeans' => [ [ - 'name' => 'fit_style', + 'name' => 'Fit', + 'slug' => 'fit', 'type' => 'select', 'field' => 'Select', 'required' => true, + 'is_translatable' => false, 'options' => [ - ['label' => 'Skinny', 'value' => 'skinny'], - ['label' => 'Slim', 'value' => 'slim'], - ['label' => 'Regular', 'value' => 'regular'], - ['label' => 'Relaxed', 'value' => 'relaxed'], - ['label' => 'Bootcut', 'value' => 'bootcut'] - ], - 'description' => 'Style of the fit' + [ + 'translations' => [ + 'en' => 'Skinny', + 'de' => 'Skinny', + 'fr' => 'Skinny' + ] + ], + [ + 'translations' => [ + 'en' => 'Slim', + 'de' => 'Slim', + 'fr' => 'Slim' + ] + ], + [ + 'translations' => [ + 'en' => 'Regular', + 'de' => 'Regular', + 'fr' => 'Regular' + ] + ], + [ + 'translations' => [ + 'en' => 'Relaxed', + 'de' => 'Relaxed', + 'fr' => 'Relaxed' + ] + ], + [ + 'translations' => [ + 'en' => 'Wide Leg', + 'de' => 'Wide Leg', + 'fr' => 'Wide Leg' + ] + ], + [ + 'translations' => [ + 'en' => 'Boot Cut', + 'de' => 'Boot Cut', + 'fr' => 'Boot Cut' + ] + ] + ] ], [ - 'name' => 'fabric_weight', - 'type' => 'number', - 'field' => 'TextInput', + 'name' => 'Rise', + 'slug' => 'rise', + 'type' => 'select', + 'field' => 'Select', 'required' => true, - 'description' => 'Weight of the denim in oz/yd²', - 'unit' => 'oz/yd²' + 'is_translatable' => true, + 'options' => [ + [ + 'translations' => [ + 'en' => 'Low Rise', + 'de' => 'Niedriger Bund', + 'fr' => 'Taille basse' + ] + ], + [ + 'translations' => [ + 'en' => 'Mid Rise', + 'de' => 'Mittlerer Bund', + 'fr' => 'Taille moyenne' + ] + ], + [ + 'translations' => [ + 'en' => 'High Rise', + 'de' => 'Hoher Bund', + 'fr' => 'Taille haute' + ] + ], + [ + 'translations' => [ + 'en' => 'Ultra High Rise', + 'de' => 'Ultrahoher Bund', + 'fr' => 'Taille très haute' + ] + ] + ] ], [ - 'name' => 'features', + 'name' => 'Wash', + 'slug' => 'wash', 'type' => 'select', 'field' => 'Select', 'required' => true, + 'is_translatable' => true, 'options' => [ - ['label' => 'Stretch', 'value' => 'stretch'], - ['label' => 'Distressed', 'value' => 'distressed'], - ['label' => 'Raw Denim', 'value' => 'raw_denim'], - ['label' => 'Stone Washed', 'value' => 'stone_washed'], - ['label' => 'Ripped', 'value' => 'ripped'] - ], - 'description' => 'Special features of the jeans' + [ + 'translations' => [ + 'en' => 'Light Wash', + 'de' => 'Heller Waschgang', + 'fr' => 'Délavage clair' + ] + ], + [ + 'translations' => [ + 'en' => 'Medium Wash', + 'de' => 'Mittlerer Waschgang', + 'fr' => 'Délavage moyen' + ] + ], + [ + 'translations' => [ + 'en' => 'Dark Wash', + 'de' => 'Dunkler Waschgang', + 'fr' => 'Délavage foncé' + ] + ], + [ + 'translations' => [ + 'en' => 'Raw/Unwashed', + 'de' => 'Roh/Ungebleicht', + 'fr' => 'Brut/Non lavé' + ] + ], + [ + 'translations' => [ + 'en' => 'Acid Wash', + 'de' => 'Säurewaschgang', + 'fr' => 'Délavage acide' + ] + ], + [ + 'translations' => [ + 'en' => 'Stone Wash', + 'de' => 'Steinwaschgang', + 'fr' => 'Délavage pierre' + ] + ] + ] + ], + [ + 'name' => 'Stretch Level', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'options' => [ + [ + 'translations' => [ + 'en' => 'No Stretch', + 'de' => 'Keine Dehnung', + 'fr' => 'Pas d\'élasticité' + ] + ], + [ + 'translations' => [ + 'en' => 'Slight Stretch', + 'de' => 'Geringe Dehnung', + 'fr' => 'Légère élasticité' + ] + ], + [ + 'translations' => [ + 'en' => 'Stretch', + 'de' => 'Dehnung', + 'fr' => 'Élasticité' + ] + ], + [ + 'translations' => [ + 'en' => 'Super Stretch', + 'de' => 'Superdehnung', + 'fr' => 'Super élasticité' + ] + ] + ] + ], + [ + 'name' => 'Inseam Length', + 'type' => 'number', + 'field' => 'TextInput', + 'required' => true, + 'unit' => 'cm' ] ], 'Dress' => [ [ - 'name' => 'style', + 'name' => 'Length', + 'slug' => 'length', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'is_translatable' => false, + 'options' => [ + [ + 'translations' => [ + 'en' => 'Mini', + 'de' => 'Mini', + 'fr' => 'Mini' + ] + ], + [ + 'translations' => [ + 'en' => 'Midi', + 'de' => 'Midi', + 'fr' => 'Midi' + ] + ], + [ + 'translations' => [ + 'en' => 'Maxi', + 'de' => 'Maxi', + 'fr' => 'Maxi' + ] + ], + [ + 'translations' => [ + 'en' => 'Above Knee', + 'de' => 'Above Knee', + 'fr' => 'Above Knee' + ] + ], + [ + 'translations' => [ + 'en' => 'Knee Length', + 'de' => 'Knee Length', + 'fr' => 'Knee Length' + ] + ] + ] + ], + [ + 'name' => 'Silhouette', + 'slug' => 'silhouette', 'type' => 'select', 'field' => 'Select', 'required' => true, + 'is_translatable' => false, 'options' => [ - ['label' => 'Casual', 'value' => 'casual'], - ['label' => 'Formal', 'value' => 'formal'], - ['label' => 'Party', 'value' => 'party'], - ['label' => 'Business', 'value' => 'business'], - ['label' => 'Evening', 'value' => 'evening'] - ], - 'description' => 'Style category of the dress' - ], - [ - 'name' => 'care_instructions', - 'type' => 'text', - 'field' => 'Textarea', + [ + 'translations' => [ + 'en' => 'A-Line', + 'de' => 'A-Line', + 'fr' => 'A-Line' + ] + ], + [ + 'translations' => [ + 'en' => 'Bodycon', + 'de' => 'Bodycon', + 'fr' => 'Bodycon' + ] + ], + [ + 'translations' => [ + 'en' => 'Empire', + 'de' => 'Empire', + 'fr' => 'Empire' + ] + ], + [ + 'translations' => [ + 'en' => 'Shift', + 'de' => 'Shift', + 'fr' => 'Shift' + ] + ], + [ + 'translations' => [ + 'en' => 'Wrap', + 'de' => 'Wrap', + 'fr' => 'Wrap' + ] + ], + [ + 'translations' => [ + 'en' => 'Ball Gown', + 'de' => 'Ball Gown', + 'fr' => 'Ball Gown' + ] + ] + ] + ], + [ + 'name' => 'Neckline', + 'slug' => 'neckline', + 'type' => 'select', + 'field' => 'Select', 'required' => true, - 'description' => 'Care and washing instructions' + 'is_translatable' => false, + 'options' => [ + [ + 'translations' => [ + 'en' => 'V-Neck', + 'de' => 'V-Neck', + 'fr' => 'V-Neck' + ] + ], + [ + 'translations' => [ + 'en' => 'Round Neck', + 'de' => 'Round Neck', + 'fr' => 'Round Neck' + ] + ], + [ + 'translations' => [ + 'en' => 'Square Neck', + 'de' => 'Square Neck', + 'fr' => 'Square Neck' + ] + ], + [ + 'translations' => [ + 'en' => 'Sweetheart', + 'de' => 'Sweetheart', + 'fr' => 'Sweetheart' + ] + ], + [ + 'translations' => [ + 'en' => 'Halter', + 'de' => 'Halter', + 'fr' => 'Halter' + ] + ], + [ + 'translations' => [ + 'en' => 'Off-Shoulder', + 'de' => 'Off-Shoulder', + 'fr' => 'Off-Shoulder' + ] + ] + ] ], [ - 'name' => 'primary_color', + 'name' => 'Sleeve Type', + 'slug' => 'sleeve-type', + 'type' => 'select', + 'field' => 'Select', + 'required' => true, + 'is_translatable' => true, + 'options' => [ + [ + 'translations' => [ + 'en' => 'Sleeveless', + 'de' => 'Ärmellos', + 'fr' => 'Sans manches' + ] + ], + [ + 'translations' => [ + 'en' => 'Cap Sleeve', + 'de' => 'Kurzarm', + 'fr' => 'Manche courte' + ] + ], + [ + 'translations' => [ + 'en' => 'Short Sleeve', + 'de' => 'Kurzarm', + 'fr' => 'Manche courte' + ] + ], + [ + 'translations' => [ + 'en' => 'Long Sleeve', + 'de' => 'Langarm', + 'fr' => 'Manche longue' + ] + ], + [ + 'translations' => [ + 'en' => 'Bell Sleeve', + 'de' => 'Glockenärmel', + 'fr' => 'Manche cloche' + ] + ], + [ + 'translations' => [ + 'en' => 'Flutter Sleeve', + 'de' => 'Flatterärmel', + 'fr' => 'Manche papillon' + ] + ] + ] + ], + [ + 'name' => 'Main Color', 'type' => 'color', 'field' => 'ColorPicker', - 'required' => true, - 'description' => 'Primary color of the dress' + 'required' => true + ], + [ + 'name' => 'Has Pockets', + 'type' => 'boolean', + 'field' => 'Toggle', + 'required' => false ] ] ]; foreach ($attributesByType as $typeName => $attributes) { - $productType = ProductType::where('name', $typeName)->first(); - if ($productType) { - foreach ($attributes as $attributeData) { - $productType->attributes()->create($attributeData); + $type = ProductType::where('name', $typeName)->first(); + + if (!$type) { + Log::warning("Product type not found: {$typeName}"); + continue; + } + + foreach ($attributes as $rank => $attributeData) { + $attribute = ProductTypeAttribute::create([ + 'name' => $attributeData['name'], + 'slug' => $attributeData['slug'] ?? Str::slug($attributeData['name']), + 'type' => $attributeData['type'], + 'field' => $attributeData['field'], + 'required' => $attributeData['required'], + 'rank' => $rank, + 'unit' => $attributeData['unit'] ?? null, + 'is_translatable' => $attributeData['is_translatable'] ?? false, + 'product_type_id' => $type->id, + ]); + + Log::info("Created attribute: {$attributeData['name']} for type: {$typeName}"); + + // Create options if they exist + if (isset($attributeData['options'])) { + foreach ($attributeData['options'] as $option) { + try { + // Create the option + $attributeOption = ProductTypeAttributeOption::create([ + 'product_type_attribute_id' => $attribute->id, + ]); + + Log::info("Created option for attribute: {$attributeData['name']}"); + + // Create localized values for each locale + foreach ($locales as $locale) { + // Get the translated value for this locale, fallback to English if not available + $translatedValue = $option['translations'][$locale->code] ?? $option['translations']['en']; + + $value = ProductTypeAttributeOptionValue::create([ + 'value' => $translatedValue, + 'locale_id' => $locale->id, + 'product_type_attribute_option_id' => $attributeOption->id, + ]); + + Log::info("Created option value for locale: {$locale->code}, value: {$value->value}"); + } + } catch (\Exception $e) { + Log::error("Error creating option: " . $e->getMessage()); + } + } } } } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index a6c3e29..7557eab 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -12,10 +12,10 @@ public function run(): void UserSeeder::class, CategorySeeder::class, ProductTypeSeeder::class, + LocaleSeeder::class, AttributeSeeder::class, SellerDataSeeder::class, LocationSeeder::class, - LocaleSeeder::class, ProductSeeder::class, ]); } diff --git a/draft.yaml b/draft.yaml index 1488c5d..06255fb 100644 --- a/draft.yaml +++ b/draft.yaml @@ -1,5 +1,5 @@ models: - + Seller: name: string hideProducts: boolean default:false @@ -69,6 +69,8 @@ models: seller_variant_id: id foreign nullable image: string number: integer default:1 + relationships: + hasOne: GoldenProductImage SellerVariant: name: string nullable @@ -109,7 +111,7 @@ models: symbol: string name: string nullable is_default: boolean default:false - + relationships: hasMany: Price @@ -122,9 +124,10 @@ models: name: string relationships: hasMany: ProductTypeAttribute:attribute, GoldenProduct:product - + ProductTypeAttribute: name: string + slug: string type: enum:text,boolean,number,select,url,color is_translatable: boolean default:false field: enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker @@ -133,14 +136,40 @@ models: description: string nullable unit: string nullable is_variant_attribute: boolean default:false - options: json nullable validators: json nullable product_type_id: id foreign + relationships: + hasMany: ProductTypeAttributeOption:option + + ProductTypeAttributeOption: + product_type_attribute_id: id foreign + relationships: + hasMany: ProductTypeAttributeOptionValue:value + + ProductTypeAttributeOptionValue: + value: string + locale_id: id foreign + product_type_attribute_option_id: id foreign + relationships: + belongsToMany: GoldenProductAttribute GoldenProduct: product_type_id: id foreign relationships: - hasMany: GoldenProductLocalized:translation, SellerProduct, GoldenProductVariant:variant + hasMany: GoldenProductLocalized:translation, SellerProduct, GoldenProductVariant:variant, GoldenProductAttribute:attribute + + GoldenProductAttribute: + product_type_attribute_id: id foreign + golden_product_id: id foreign + is_option: boolean default:false + relationships: + hasMany: GoldenProductAttributeValue:value + belongsToMany: ProductTypeAttributeOptionValue:optionValue + + GoldenProductAttributeValue: + value: string + golden_product_attribute_id: id foreign + locale_id: id foreign GoldenProductLocalized: name: string @@ -161,6 +190,12 @@ models: golden_product_variant_id: id foreign locale_id: id foreign + GoldenProductImage: + golden_product_id: id foreign + image: string + number: integer default:1 + seller_product_image_id: id foreign + Locale: code: string name: string diff --git a/public/vendor/log-viewer/app.css b/public/vendor/log-viewer/app.css new file mode 100644 index 0000000..f3662ef --- /dev/null +++ b/public/vendor/log-viewer/app.css @@ -0,0 +1 @@ +/*! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e4e4e7;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a1a1aa;opacity:1}input::placeholder,textarea::placeholder{color:#a1a1aa;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{bottom:0;top:0}.-left-\[200\%\]{left:-200%}.bottom-0{bottom:0}.bottom-10{bottom:2.5rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-3{left:.75rem}.right-0{right:0}.right-4{right:1rem}.right-7{right:1.75rem}.right-\[200\%\]{right:200%}.top-0{top:0}.top-9{top:2.25rem}.z-10{z-index:10}.z-20{z-index:20}.m-1{margin:.25rem}.-my-1{margin-bottom:-.25rem;margin-top:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-1{margin-bottom:.25rem;margin-top:.25rem}.my-auto{margin-bottom:auto;margin-top:auto}.-mb-0\.5{margin-bottom:-.125rem}.-mb-px{margin-bottom:-1px}.-mr-2{margin-right:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-5{margin-left:1.25rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-2\.5{margin-right:.625rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0{height:0}.h-14{height:3.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-\[18px\]{height:18px}.h-full{height:100%}.max-h-60{max-height:15rem}.max-h-screen{max-height:100vh}.min-h-\[38px\]{min-height:38px}.min-h-screen{min-height:100vh}.w-14{width:3.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-\[18px\]{width:18px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.min-w-\[240px\]{min-width:240px}.min-w-full{min-width:100%}.max-w-\[1px\]{max-width:1px}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.shrink{flex-shrink:1}.table-fixed{table-layout:fixed}.border-separate{border-collapse:separate}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x:100%}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-90,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-flow-col{grid-auto-flow:column}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-brand-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.bg-brand-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-opacity-75{--tw-bg-opacity:0.75}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-gray-100{--tw-gradient-from:#f4f4f5 var(--tw-gradient-from-position);--tw-gradient-to:hsla(240,5%,96%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.p-1{padding:.25rem}.p-12{padding:3rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pb-1{padding-bottom:.25rem}.pb-16{padding-bottom:4rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pr-9{padding-right:2.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-brand-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.text-brand-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.text-brand-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.opacity-90{opacity:.9}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-brand-500{outline-color:#0ea5e9}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-opacity-5{--tw-ring-opacity:0.05}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.spin{-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:spin;-moz-animation-name:spin;-ms-animation-name:spin;animation-name:spin;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;animation-timing-function:linear}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}html.dark{color-scheme:dark}#bmc-wbtn{height:48px!important;width:48px!important}#bmc-wbtn>img{height:32px!important;width:32px!important}.log-levels-selector .dropdown-toggle{white-space:nowrap}.log-levels-selector .dropdown-toggle:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.log-levels-selector .dropdown-toggle:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.log-levels-selector .dropdown-toggle>svg{height:1rem;margin-left:.25rem;opacity:.75;width:1rem}.log-levels-selector .dropdown .log-level{font-weight:600}.log-levels-selector .dropdown .log-level.notice,.log-levels-selector .dropdown .log-level.success{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.notice:is(.dark *),.log-levels-selector .dropdown .log-level.success:is(.dark *){--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.info{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.info:is(.dark *){--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.warning{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.warning:is(.dark *){--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.danger{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.danger:is(.dark *){--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.none{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-level.none:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-levels-selector .dropdown .log-count{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity));margin-left:2rem;white-space:nowrap}.log-levels-selector .dropdown .log-count:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.notice,.log-levels-selector .dropdown button.active .log-level.success{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.info{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.warning{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.danger{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-level.none{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-count{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.log-levels-selector .dropdown button.active .log-count:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.log-levels-selector .dropdown .no-results{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity));font-size:.75rem;line-height:1rem;padding:.25rem 1rem;text-align:center}.log-levels-selector .dropdown .no-results:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-item{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));cursor:pointer;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.log-item:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.log-item.notice.active>td,.log-item.notice:focus-within>td,.log-item.notice:hover>td,.log-item.success.active>td,.log-item.success:focus-within>td,.log-item.success:hover>td{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.log-item.notice.active>td:is(.dark *),.log-item.notice:focus-within>td:is(.dark *),.log-item.notice:hover>td:is(.dark *),.log-item.success.active>td:is(.dark *),.log-item.success:focus-within>td:is(.dark *),.log-item.success:hover>td:is(.dark *){--tw-bg-opacity:0.4;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.log-item.notice .log-level-indicator,.log-item.success .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.log-item.notice .log-level-indicator:is(.dark *),.log-item.success .log-level-indicator:is(.dark *){--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.log-item.notice .log-level,.log-item.success .log-level{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.log-item.notice .log-level:is(.dark *),.log-item.success .log-level:is(.dark *){--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.log-item.info.active>td,.log-item.info:focus-within>td,.log-item.info:hover>td{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.log-item.info.active>td:is(.dark *),.log-item.info:focus-within>td:is(.dark *),.log-item.info:hover>td:is(.dark *){--tw-bg-opacity:0.4;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.log-item.info .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.log-item.info .log-level-indicator:is(.dark *){--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.log-item.info .log-level{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.log-item.info .log-level:is(.dark *){--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.log-item.warning.active>td,.log-item.warning:focus-within>td,.log-item.warning:hover>td{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.log-item.warning.active>td:is(.dark *),.log-item.warning:focus-within>td:is(.dark *),.log-item.warning:hover>td:is(.dark *){--tw-bg-opacity:0.4;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.log-item.warning .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.log-item.warning .log-level-indicator:is(.dark *){--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.log-item.warning .log-level{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.log-item.warning .log-level:is(.dark *){--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.log-item.danger.active>td,.log-item.danger:focus-within>td,.log-item.danger:hover>td{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.log-item.danger.active>td:is(.dark *),.log-item.danger:focus-within>td:is(.dark *),.log-item.danger:hover>td:is(.dark *){--tw-bg-opacity:0.4;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.log-item.danger .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.log-item.danger .log-level-indicator:is(.dark *){--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.log-item.danger .log-level{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.log-item.danger .log-level:is(.dark *){--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.log-item.none.active>td,.log-item.none:focus-within>td,.log-item.none:hover>td{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.log-item.none.active>td:is(.dark *),.log-item.none:focus-within>td:is(.dark *),.log-item.none:hover>td:is(.dark *){--tw-bg-opacity:0.4;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.log-item.none .log-level-indicator{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.log-item.none .log-level-indicator:is(.dark *){--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.log-item.none .log-level{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.log-item.none .log-level:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.log-item:hover .log-level-icon{opacity:1}.badge{align-items:center;border-radius:.375rem;cursor:pointer;display:inline-flex;font-size:.875rem;line-height:1.25rem;margin-right:.5rem;margin-top:.25rem;padding:.25rem .75rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.badge.notice,.badge.success{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity));border-color:rgb(167 243 208/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.badge.notice:is(.dark *),.badge.success:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity));border-color:rgb(6 95 70/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.notice:hover,.badge.success:hover{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.badge.notice:hover:is(.dark *),.badge.success:hover:is(.dark *){--tw-bg-opacity:0.75;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.badge.notice .checkmark,.badge.success .checkmark{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.badge.notice .checkmark:is(.dark *),.badge.success .checkmark:is(.dark *){--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.badge.notice.active,.badge.success.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity));border-color:rgb(4 120 87/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.badge.notice.active:is(.dark *),.badge.success.active:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity));border-color:rgb(5 150 105/var(--tw-border-opacity))}.badge.notice.active:hover,.badge.success.active:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.badge.notice.active:hover:is(.dark *),.badge.success.active:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.badge.notice.active .checkmark,.badge.success.active .checkmark{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.badge.notice.active .checkmark:is(.dark *),.badge.success.active .checkmark:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity));border-color:rgb(4 120 87/var(--tw-border-opacity))}.badge.notice.active .checkmark>svg,.badge.success.active .checkmark>svg{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.badge.notice.active .checkmark>svg:is(.dark *),.badge.success.active .checkmark>svg:is(.dark *){--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.badge.info{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity));border-color:rgb(186 230 253/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.badge.info:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity));border-color:rgb(7 89 133/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.info:hover{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.badge.info:hover:is(.dark *){--tw-bg-opacity:0.75;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.badge.info .checkmark{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.badge.info .checkmark:is(.dark *){--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.badge.info.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity));border-color:rgb(3 105 161/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.badge.info.active:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity));border-color:rgb(2 132 199/var(--tw-border-opacity))}.badge.info.active:hover{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.badge.info.active:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.badge.info.active .checkmark{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.badge.info.active .checkmark:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity));border-color:rgb(3 105 161/var(--tw-border-opacity))}.badge.info.active .checkmark>svg{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.badge.info.active .checkmark>svg:is(.dark *){--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.badge.warning{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity));border-color:rgb(253 230 138/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.badge.warning:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity));border-color:rgb(146 64 14/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.warning:hover{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.badge.warning:hover:is(.dark *){--tw-bg-opacity:0.75;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.badge.warning .checkmark{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.badge.warning .checkmark:is(.dark *){--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.badge.warning.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity));border-color:rgb(180 83 9/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.badge.warning.active:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity));border-color:rgb(217 119 6/var(--tw-border-opacity))}.badge.warning.active:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.badge.warning.active:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.badge.warning.active .checkmark{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.badge.warning.active .checkmark:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity));border-color:rgb(180 83 9/var(--tw-border-opacity))}.badge.warning.active .checkmark>svg{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.badge.warning.active .checkmark>svg:is(.dark *){--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.badge.danger{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity));border-color:rgb(254 205 211/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.badge.danger:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity));border-color:rgb(159 18 57/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.danger:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.badge.danger:hover:is(.dark *){--tw-bg-opacity:0.75;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.badge.danger .checkmark{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.badge.danger .checkmark:is(.dark *){--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.badge.danger.active{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity));border-color:rgb(190 18 60/var(--tw-border-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.badge.danger.active:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity));border-color:rgb(225 29 72/var(--tw-border-opacity))}.badge.danger.active:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.badge.danger.active:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.badge.danger.active .checkmark{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.badge.danger.active .checkmark:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity));border-color:rgb(190 18 60/var(--tw-border-opacity))}.badge.danger.active .checkmark>svg{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.badge.danger.active .checkmark>svg:is(.dark *){--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.badge.none{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-width:1px;color:rgb(82 82 91/var(--tw-text-opacity))}.badge.none:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:0.4;--tw-text-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));border-color:rgb(39 39 42/var(--tw-border-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}.badge.none:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.badge.none:hover:is(.dark *){--tw-bg-opacity:0.75;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.badge.none .checkmark{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.badge.none .checkmark:is(.dark *){--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.badge.none.active{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));color:rgb(39 39 42/var(--tw-text-opacity))}.badge.none.active:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(82 82 91/var(--tw-border-opacity));color:rgb(244 244 245/var(--tw-text-opacity))}.badge.none.active:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.badge.none.active:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.badge.none.active .checkmark{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.badge.none.active .checkmark:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity))}.badge.none.active .checkmark>svg{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.badge.none.active .checkmark>svg:is(.dark *){--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.log-list table>thead th{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));color:rgb(113 113 122/var(--tw-text-opacity));font-size:.75rem;font-weight:600;line-height:1rem;padding:.5rem .25rem;position:sticky;text-align:left;top:0;z-index:10}.file-list .folder-container .folder-item-container.log-list table>thead th{position:sticky}.log-list table>thead th:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));color:rgb(161 161 170/var(--tw-text-opacity))}@media (min-width:1024px){.log-list table>thead th{font-size:.875rem;line-height:1.25rem;padding-left:.5rem;padding-right:.5rem}}.log-list .log-group{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));position:relative}.log-list .log-group:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));color:rgb(228 228 231/var(--tw-text-opacity))}.log-list .log-group .log-item>td{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity));border-top-width:1px;font-size:.75rem;line-height:1rem;padding:.375rem .25rem}.log-list .log-group .log-item>td:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .log-item>td{font-size:.875rem;line-height:1.25rem;padding:.5rem}}.log-list .log-group.first .log-item>td{border-top-color:transparent}.log-list .log-group .mail-preview-attributes{--tw-border-opacity:1;background-color:rgba(240,249,255,.3);border-color:rgb(224 242 254/var(--tw-border-opacity));border-radius:.25rem;border-width:1px;font-size:.75rem;line-height:1rem;margin-bottom:1rem;overflow-x:auto;width:100%}.log-list .log-group .mail-preview-attributes:is(.dark *){--tw-border-opacity:1;background-color:rgba(12,74,110,.2);border-color:rgb(7 89 133/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .mail-preview-attributes{font-size:.875rem;line-height:1.25rem;margin-bottom:1.5rem;overflow:hidden}}.log-list .log-group .mail-preview-attributes table{width:100%}.log-list .log-group .mail-preview-attributes td{padding:.25rem .5rem}@media (min-width:1024px){.log-list .log-group .mail-preview-attributes td{padding:.5rem 1.5rem}}.log-list .log-group .mail-preview-attributes td:not(:first-child){overflow-wrap:anywhere}.log-list .log-group .mail-preview-attributes tr:first-child td{padding-top:.375rem}@media (min-width:1024px){.log-list .log-group .mail-preview-attributes tr:first-child td{padding-top:.75rem}}.log-list .log-group .mail-preview-attributes tr:last-child td{padding-bottom:.375rem}@media (min-width:1024px){.log-list .log-group .mail-preview-attributes tr:last-child td{padding-bottom:.75rem}}.log-list .log-group .mail-preview-attributes tr:not(:last-child) td{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(224 242 254/var(--tw-border-opacity))}.log-list .log-group .mail-preview-attributes tr:not(:last-child) td:is(.dark *){--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.log-list .log-group .mail-preview-html{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-radius:.25rem;border-width:1px;margin-bottom:1rem;overflow:auto;width:100%}.log-list .log-group .mail-preview-html:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .mail-preview-html{margin-bottom:1.5rem}}.log-list .log-group .mail-preview-text{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-radius:.25rem;border-width:1px;font-size:.875rem;line-height:1.25rem;margin-bottom:1rem;padding:1rem;white-space:pre-wrap;width:100%}.log-list .log-group .mail-preview-text:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .mail-preview-text{margin-bottom:1.5rem}}.log-list .log-group .mail-attachment-button{--tw-bg-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.25rem;border-width:1px;display:flex;justify-content:space-between;padding:.25rem .5rem}.log-list .log-group .mail-attachment-button:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .mail-attachment-button{padding:.5rem 1rem}}.log-list .log-group .mail-attachment-button{max-width:460px}.log-list .log-group .mail-attachment-button:not(:last-child){margin-bottom:.5rem}.log-list .log-group .mail-attachment-button a:focus{outline-color:#0ea5e9}.log-list .log-group .tabs-container{font-size:.75rem;line-height:1rem}@media (min-width:1024px){.log-list .log-group .tabs-container{font-size:.875rem;line-height:1.25rem}}.log-list .log-group .log-stack,.log-list .log-group .mail-preview,.log-list .log-group .tabs-container{padding:.25rem .5rem}@media (min-width:1024px){.log-list .log-group .log-stack,.log-list .log-group .mail-preview,.log-list .log-group .tabs-container{padding:.5rem 2rem}}.log-list .log-group .log-stack{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity));font-size:10px;line-height:.75rem;white-space:pre-wrap;word-break:break-all}.log-list .log-group .log-stack:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}@media (min-width:1024px){.log-list .log-group .log-stack{font-size:.75rem;line-height:1rem}}.log-list .log-group .log-link{align-items:center;border-radius:.25rem;display:flex;justify-content:flex-end;margin-bottom:-.125rem;margin-top:-.125rem;padding-bottom:.125rem;padding-left:.25rem;padding-top:.125rem;width:100%}@media (min-width:640px){.log-list .log-group .log-link{min-width:64px}}.log-list .log-group .log-link>svg{height:1rem;margin-left:.25rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem}.log-list .log-group .log-link:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.log-list .log-group .log-link:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.log-list .log-group code,.log-list .log-group mark{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(24 24 27/var(--tw-text-opacity));padding:.125rem .25rem}.log-list .log-group code:is(.dark *),.log-list .log-group mark:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.pagination{align-items:center;display:flex;justify-content:center;width:100%}@media (min-width:640px){.pagination{margin-top:.5rem;padding-left:1rem;padding-right:1rem}}@media (min-width:1024px){.pagination{padding-left:0;padding-right:0}}.pagination .previous{display:flex;flex:1 1 0%;justify-content:flex-start;margin-top:-1px;width:0}@media (min-width:768px){.pagination .previous{justify-content:flex-end}}.pagination .previous button{--tw-text-opacity:1;align-items:center;border-color:transparent;border-top-width:2px;color:rgb(113 113 122/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-right:.25rem;padding-top:.75rem}.pagination .previous button:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.pagination .previous button:hover{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity));color:rgb(63 63 70/var(--tw-text-opacity))}.pagination .previous button:hover:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.pagination .previous button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.pagination .previous button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.pagination .previous button svg{color:currentColor;height:1.25rem;margin-left:.75rem;margin-right:.75rem;width:1.25rem}.pagination .next{display:flex;flex:1 1 0%;justify-content:flex-end;margin-top:-1px;width:0}@media (min-width:768px){.pagination .next{justify-content:flex-start}}.pagination .next button{--tw-text-opacity:1;align-items:center;border-color:transparent;border-top-width:2px;color:rgb(113 113 122/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-left:.25rem;padding-top:.75rem}.pagination .next button:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.pagination .next button:hover{--tw-border-opacity:1;--tw-text-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity));color:rgb(63 63 70/var(--tw-text-opacity))}.pagination .next button:hover:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.pagination .next button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.pagination .next button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.pagination .next button svg{color:currentColor;height:1.25rem;margin-left:.75rem;margin-right:.75rem;width:1.25rem}.pagination .pages{display:none}@media (min-width:640px){.pagination .pages{display:flex;margin-top:-1px}}.pagination .pages span{--tw-text-opacity:1;align-items:center;border-color:transparent;border-top-width:2px;color:rgb(113 113 122/var(--tw-text-opacity));display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-left:1rem;padding-right:1rem;padding-top:.75rem}.pagination .pages span:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.pagination .pages button{align-items:center;border-top-width:2px;display:inline-flex;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-left:1rem;padding-right:1rem;padding-top:.75rem}.pagination .pages button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-radius:.375rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.pagination .pages button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.search{--tw-border-opacity:1;--tw-bg-opacity:1;align-items:center;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(212 212 216/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;display:flex;font-size:.875rem;line-height:1.25rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}.search:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(82 82 91/var(--tw-border-opacity));color:rgb(244 244 245/var(--tw-text-opacity))}.search .prefix-icon{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));margin-left:.75rem;margin-right:.25rem}.search .prefix-icon:is(.dark *){--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.search input{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:transparent;background-color:inherit;border-radius:.25rem;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);flex:1 1 0%;padding:.25rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%}.search input:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));border-color:transparent;outline:2px solid transparent;outline-offset:2px}.search input:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.search.has-error{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.search .submit-search button{--tw-bg-opacity:1;--tw-text-opacity:1;align-items:center;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-bottom-right-radius:.25rem;border-top-right-radius:.25rem;color:rgb(82 82 91/var(--tw-text-opacity));display:flex;padding:.5rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.search .submit-search button:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity));color:rgb(212 212 216/var(--tw-text-opacity))}.search .submit-search button:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.search .submit-search button:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.search .submit-search button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.search .submit-search button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.search .submit-search button>svg{height:1.25rem;margin-left:.25rem;opacity:.75;width:1.25rem}.search .clear-search{position:absolute;right:0;top:0}.search .clear-search button{--tw-text-opacity:1;border-radius:.25rem;color:rgb(161 161 170/var(--tw-text-opacity));padding:.25rem;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.search .clear-search button:is(.dark *){--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.search .clear-search button:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.search .clear-search button:hover:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.search .clear-search button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.search .clear-search button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.search .clear-search button>svg{height:1.25rem;width:1.25rem}.search-progress-bar{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity));border-radius:.25rem;height:.125rem;position:absolute;top:.25rem;transition-duration:.3s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:linear}.search-progress-bar:is(.dark *){--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.dropdown{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(228 228 231/var(--tw-border-opacity));border-radius:.375rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:rgb(24 24 27/var(--tw-text-opacity));margin-top:-.25rem;overflow:hidden;position:absolute;right:.25rem;top:100%;z-index:40}.dropdown:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));border-color:rgb(63 63 70/var(--tw-border-opacity));color:rgb(228 228 231/var(--tw-text-opacity))}.dropdown:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));--tw-ring-opacity:0.5;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.dropdown:focus:is(.dark *){--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity));--tw-ring-opacity:0.5}.dropdown{transform-origin:top right!important}.dropdown.up{bottom:100%;margin-bottom:-.25rem;margin-top:0;top:auto;transform-origin:bottom right!important}.dropdown.left{left:.25rem;right:auto;transform-origin:top left!important}.dropdown.left.up{transform-origin:bottom left!important}.dropdown a:not(.inline-link),.dropdown button:not(.inline-link){align-items:center;display:block;display:flex;font-size:.875rem;line-height:1.25rem;outline-color:#0ea5e9;padding:.5rem 1rem;text-align:left;width:100%}.dropdown a:not(.inline-link):is(.dark *),.dropdown button:not(.inline-link):is(.dark *){outline-color:#075985}.dropdown a:not(.inline-link)>svg,.dropdown button:not(.inline-link)>svg{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));height:1rem;margin-right:.75rem;width:1rem}.dropdown a:not(.inline-link)>svg.spin,.dropdown button:not(.inline-link)>svg.spin{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.dropdown a.active,.dropdown a:hover,.dropdown button.active,.dropdown button:hover{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.dropdown a.active>.checkmark,.dropdown a:hover>.checkmark,.dropdown button.active>.checkmark,.dropdown button:hover>.checkmark{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.dropdown a.active>.checkmark:is(.dark *),.dropdown a:hover>.checkmark:is(.dark *),.dropdown button.active>.checkmark:is(.dark *),.dropdown button:hover>.checkmark:is(.dark *){--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.dropdown a.active>svg,.dropdown a:hover>svg,.dropdown button.active>svg,.dropdown button:hover>svg{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dropdown .divider{border-top-width:1px;margin-bottom:.5rem;margin-top:.5rem;width:100%}.dropdown .divider:is(.dark *){--tw-border-opacity:1;border-top-color:rgb(63 63 70/var(--tw-border-opacity))}.dropdown .label{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));font-size:.75rem;font-weight:600;line-height:1rem;margin:.25rem 1rem}.file-list{height:100%;overflow-y:auto;padding-bottom:1rem;padding-left:.75rem;padding-right:.75rem;position:relative}@media (min-width:768px){.file-list{padding-left:0;padding-right:0}}.file-list .file-item-container,.file-list .folder-item-container{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));border-radius:.375rem;color:rgb(39 39 42/var(--tw-text-opacity));margin-top:.5rem;position:relative;top:0}.file-list .file-item-container:is(.dark *),.file-list .folder-item-container:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity));color:rgb(228 228 231/var(--tw-text-opacity))}.file-list .file-item-container .file-item,.file-list .folder-item-container .file-item{border-color:transparent;border-radius:.375rem;border-width:1px;cursor:pointer;position:relative;transition-duration:.1s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.file-list .file-item-container .file-item,.file-list .file-item-container .file-item .file-item-info,.file-list .folder-item-container .file-item,.file-list .folder-item-container .file-item .file-item-info{align-items:center;display:flex;justify-content:space-between;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter}.file-list .file-item-container .file-item .file-item-info,.file-list .folder-item-container .file-item .file-item-info{border-bottom-left-radius:.375rem;border-top-left-radius:.375rem;flex:1 1 0%;outline-color:#0ea5e9;padding:.5rem .75rem .5rem 1rem;text-align:left;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.file-list .file-item-container .file-item .file-item-info:is(.dark *),.file-list .folder-item-container .file-item .file-item-info:is(.dark *){outline-color:#0369a1}.file-list .file-item-container .file-item .file-item-info:hover,.file-list .folder-item-container .file-item .file-item-info:hover{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.file-list .file-item-container .file-item .file-item-info:hover:is(.dark *),.file-list .folder-item-container .file-item .file-item-info:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.file-list .file-item-container .file-item .file-icon,.file-list .folder-item-container .file-item .file-icon{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));margin-right:.5rem}.file-list .file-item-container .file-item .file-icon:is(.dark *),.file-list .folder-item-container .file-item .file-icon:is(.dark *){--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.file-list .file-item-container .file-item .file-icon>svg,.file-list .folder-item-container .file-item .file-icon>svg{height:1rem;width:1rem}.file-list .file-item-container .file-item .file-name,.file-list .folder-item-container .file-item .file-name{font-size:.875rem;line-height:1.25rem;margin-right:.75rem;width:100%;word-break:break-word}.file-list .file-item-container .file-item .file-size,.file-list .folder-item-container .file-item .file-size{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity));font-size:.75rem;line-height:1rem;white-space:nowrap}.file-list .file-item-container .file-item .file-size:is(.dark *),.file-list .folder-item-container .file-item .file-size:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity));opacity:.9}.file-list .file-item-container.active .file-item,.file-list .folder-item-container.active .file-item{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity));border-color:rgb(14 165 233/var(--tw-border-opacity))}.file-list .file-item-container.active .file-item:is(.dark *),.file-list .folder-item-container.active .file-item:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:0.4;background-color:rgb(12 74 110/var(--tw-bg-opacity));border-color:rgb(12 74 110/var(--tw-border-opacity))}.file-list .file-item-container.active-folder .file-item,.file-list .folder-item-container.active-folder .file-item{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.file-list .file-item-container.active-folder .file-item:is(.dark *),.file-list .folder-item-container.active-folder .file-item:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.file-list .file-item-container:hover .file-item,.file-list .folder-item-container:hover .file-item{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.file-list .file-item-container:hover .file-item:is(.dark *),.file-list .folder-item-container:hover .file-item:is(.dark *){--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.file-list .file-item-container .file-dropdown-toggle,.file-list .folder-item-container .file-dropdown-toggle{--tw-text-opacity:1;align-items:center;align-self:stretch;border-bottom-right-radius:.375rem;border-color:transparent;border-left-width:1px;border-top-right-radius:.375rem;color:rgb(113 113 122/var(--tw-text-opacity));display:flex;justify-content:center;outline-color:#0ea5e9;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}.file-list .file-item-container .file-dropdown-toggle:is(.dark *),.file-list .folder-item-container .file-dropdown-toggle:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity));outline-color:#0369a1}.file-list .file-item-container .file-dropdown-toggle:hover,.file-list .folder-item-container .file-dropdown-toggle:hover{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity));border-color:rgb(2 132 199/var(--tw-border-opacity))}.file-list .file-item-container .file-dropdown-toggle:hover:is(.dark *),.file-list .folder-item-container .file-dropdown-toggle:hover:is(.dark *){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity));border-color:rgb(7 89 133/var(--tw-border-opacity))}.file-list .folder-container .folder-item-container.sticky{position:sticky}.file-list .folder-container:first-child>.folder-item-container{margin-top:0}.menu-button{--tw-text-opacity:1;border-radius:.375rem;color:rgb(161 161 170/var(--tw-text-opacity));cursor:pointer;outline-color:#0ea5e9;padding:.5rem;position:relative;transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.menu-button:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.menu-button:hover:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.menu-button:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}.menu-button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}a.button,button.button{--tw-text-opacity:1;align-items:center;border-radius:.375rem;color:rgb(24 24 27/var(--tw-text-opacity));display:block;display:flex;font-size:.875rem;line-height:1.25rem;outline-color:#0ea5e9;padding:.5rem 1rem;text-align:left;width:100%}a.button:is(.dark *),button.button:is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity));outline-color:#075985}a.button>svg,button.button>svg{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity));height:1rem;width:1rem}a.button>svg:is(.dark *),button.button>svg:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}a.button>svg.spin,button.button>svg.spin{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}a.button:hover,button.button:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}a.button:hover:is(.dark *),button.button:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.select{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity));border-radius:.25rem;color:rgb(63 63 70/var(--tw-text-opacity));font-weight:400;margin-bottom:-.125rem;margin-top:-.125rem;outline:2px solid transparent;outline-offset:2px;padding:.125rem .25rem}.select:is(.dark *){--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity));color:rgb(212 212 216/var(--tw-text-opacity))}.select:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.select:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.select:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.select:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.keyboard-shortcut{--tw-text-opacity:1;align-items:center;color:rgb(82 82 91/var(--tw-text-opacity));display:flex;font-size:.875rem;justify-content:flex-start;line-height:1.25rem;margin-bottom:.75rem;width:100%}.keyboard-shortcut:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.keyboard-shortcut .shortcut{--tw-border-opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgb(244 244 245/var(--tw-ring-opacity));align-items:center;border-color:rgb(161 161 170/var(--tw-border-opacity));border-radius:.25rem;border-width:1px;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);display:inline-flex;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1rem;height:1.5rem;justify-content:center;line-height:1.5rem;margin-right:.5rem;width:1.5rem}.keyboard-shortcut .shortcut:is(.dark *){--tw-border-opacity:1;--tw-text-opacity:1;--tw-ring-opacity:1;--tw-ring-color:rgb(24 24 27/var(--tw-ring-opacity));border-color:rgb(113 113 122/var(--tw-border-opacity));color:rgb(212 212 216/var(--tw-text-opacity))}.hover\:border-brand-600:hover{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.hover\:text-brand-800:hover{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.focus\:border-brand-500:focus{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:outline-brand-500:focus{outline-color:#0ea5e9}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-1:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-brand-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.group:hover .group-hover\:inline-block{display:inline-block}.group:hover .group-hover\:hidden{display:none}.group:hover .group-hover\:border-brand-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group:hover .group-hover\:opacity-100{opacity:1}.group:focus .group-focus\:inline-block{display:inline-block}.group:focus .group-focus\:hidden{display:none}.dark\:border-brand-400:is(.dark *){--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.dark\:border-brand-600:is(.dark *){--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.dark\:border-gray-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.dark\:border-yellow-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.dark\:bg-yellow-900:is(.dark *){--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.dark\:bg-opacity-40:is(.dark *){--tw-bg-opacity:0.4}.dark\:from-gray-900:is(.dark *){--tw-gradient-from:#18181b var(--tw-gradient-from-position);--tw-gradient-to:rgba(24,24,27,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:text-blue-500:is(.dark *){--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.dark\:text-brand-500:is(.dark *){--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.dark\:text-brand-600:is(.dark *){--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.dark\:text-green-500:is(.dark *){--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.dark\:text-yellow-400:is(.dark *){--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.dark\:opacity-90:is(.dark *){opacity:.9}.dark\:outline-brand-800:is(.dark *){outline-color:#075985}.dark\:hover\:border-brand-700:hover:is(.dark *){--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.dark\:hover\:border-gray-400:hover:is(.dark *){--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.hover\:dark\:border-brand-800:is(.dark *):hover{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.dark\:hover\:text-blue-400:hover:is(.dark *){--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.dark\:hover\:text-brand-600:hover:is(.dark *){--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.dark\:hover\:text-gray-200:hover:is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.dark\:focus\:ring-brand-300:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(125 211 252/var(--tw-ring-opacity))}.dark\:focus\:ring-brand-700:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.group:hover .group-hover\:dark\:border-brand-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}@media (min-width:640px){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:flex-col-reverse{flex-direction:column-reverse}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:duration-300{transition-duration:.3s}}@media (min-width:768px){.md\:fixed{position:fixed}.md\:inset-y-0{bottom:0;top:0}.md\:left-0{left:0}.md\:left-auto{left:auto}.md\:right-auto{right:auto}.md\:mx-0{margin-left:0;margin-right:0}.md\:mx-3{margin-left:.75rem;margin-right:.75rem}.md\:mt-0{margin-top:0}.md\:block{display:block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-88{width:22rem}.md\:flex-col{flex-direction:column}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:pb-12{padding-bottom:3rem}.md\:pl-88{padding-left:22rem}.md\:opacity-75{opacity:.75}}@media (min-width:1024px){.lg\:absolute{position:absolute}.lg\:left-0{left:0}.lg\:right-0{right:0}.lg\:right-6{right:1.5rem}.lg\:top-2{top:.5rem}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:mx-8{margin-left:2rem;margin-right:2rem}.lg\:mb-0{margin-bottom:0}.lg\:mt-0{margin-top:0}.lg\:block{display:block}.lg\:inline{display:inline}.lg\:table-cell{display:table-cell}.lg\:hidden{display:none}.lg\:w-auto{width:auto}.lg\:flex-row{flex-direction:row}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:pl-2{padding-left:.5rem}.lg\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width:1280px){.xl\:inline{display:inline}} diff --git a/public/vendor/log-viewer/app.js b/public/vendor/log-viewer/app.js new file mode 100644 index 0000000..eb8868e --- /dev/null +++ b/public/vendor/log-viewer/app.js @@ -0,0 +1,2 @@ +/*! For license information please see app.js.LICENSE.txt */ +(()=>{var e,t={411:(e,t,n)=>{"use strict";var r={};n.r(r),n.d(r,{BaseTransition:()=>ar,BaseTransitionPropsValidators:()=>ir,Comment:()=>us,DeprecationTypes:()=>Sa,EffectScope:()=>be,ErrorCodes:()=>wn,ErrorTypeStrings:()=>ya,Fragment:()=>as,KeepAlive:()=>wr,ReactiveEffect:()=>Se,Static:()=>cs,Suspense:()=>ts,Teleport:()=>ui,Text:()=>ls,TrackOpTypes:()=>dn,Transition:()=>Pa,TransitionGroup:()=>Ol,TriggerOpTypes:()=>pn,VueElement:()=>bl,assertNumber:()=>bn,callWithAsyncErrorHandling:()=>xn,callWithErrorHandling:()=>_n,camelize:()=>j,capitalize:()=>F,cloneVNode:()=>Ls,compatUtils:()=>xa,computed:()=>fa,createApp:()=>ru,createBlock:()=>ws,createCommentVNode:()=>Is,createElementBlock:()=>bs,createElementVNode:()=>Os,createHydrationRenderer:()=>xi,createPropsRestProxy:()=>yo,createRenderer:()=>_i,createSSRApp:()=>ou,createSlots:()=>Yr,createStaticVNode:()=>Rs,createTextVNode:()=>Ps,createVNode:()=>Es,customRef:()=>sn,defineAsyncComponent:()=>gr,defineComponent:()=>hr,defineCustomElement:()=>gl,defineEmits:()=>io,defineExpose:()=>so,defineModel:()=>uo,defineOptions:()=>ao,defineProps:()=>oo,defineSSRCustomElement:()=>ml,defineSlots:()=>lo,devtools:()=>ba,effect:()=>Ae,effectScope:()=>we,getCurrentInstance:()=>$s,getCurrentScope:()=>_e,getTransitionRawChildren:()=>pr,guardReactiveProps:()=>As,h:()=>da,handleError:()=>Sn,hasInjectionContext:()=>Do,hydrate:()=>nu,initCustomFormatter:()=>pa,initDirectivesForSSR:()=>lu,inject:()=>Fo,isMemoSame:()=>va,isProxy:()=>Bt,isReactive:()=>Mt,isReadonly:()=>Ft,isRef:()=>Kt,isRuntimeOnly:()=>ta,isShallow:()=>Dt,isVNode:()=>Cs,markRaw:()=>Vt,mergeDefaults:()=>go,mergeModels:()=>mo,mergeProps:()=>Fs,nextTick:()=>jn,normalizeClass:()=>X,normalizeProps:()=>ee,normalizeStyle:()=>K,onActivated:()=>_r,onBeforeMount:()=>Lr,onBeforeUnmount:()=>jr,onBeforeUpdate:()=>Rr,onDeactivated:()=>xr,onErrorCaptured:()=>Br,onMounted:()=>Pr,onRenderTracked:()=>Dr,onRenderTriggered:()=>Fr,onScopeDispose:()=>xe,onServerPrefetch:()=>Mr,onUnmounted:()=>Nr,onUpdated:()=>Ir,openBlock:()=>ps,popScopeId:()=>Gn,provide:()=>Mo,proxyRefs:()=>rn,pushScopeId:()=>Yn,queuePostFlushCb:()=>Fn,reactive:()=>Pt,readonly:()=>It,ref:()=>Yt,registerRuntimeCompiler:()=>ea,render:()=>tu,renderList:()=>Kr,renderSlot:()=>Gr,resolveComponent:()=>Hr,resolveDirective:()=>zr,resolveDynamicComponent:()=>qr,resolveFilter:()=>_a,resolveTransitionHooks:()=>ur,setBlockTracking:()=>ms,setDevtoolsHook:()=>wa,setTransitionHooks:()=>dr,shallowReactive:()=>Rt,shallowReadonly:()=>jt,shallowRef:()=>Gt,ssrContextKey:()=>Pi,ssrUtils:()=>Ca,stop:()=>Le,toDisplayString:()=>he,toHandlerKey:()=>D,toHandlers:()=>Qr,toRaw:()=>Ut,toRef:()=>cn,toRefs:()=>an,toValue:()=>tn,transformVNodeArgs:()=>xs,triggerRef:()=>Xt,unref:()=>en,useAttrs:()=>po,useCssModule:()=>wl,useCssVars:()=>Qa,useModel:()=>Hi,useSSRContext:()=>Ri,useSlots:()=>fo,useTransitionState:()=>rr,vModelCheckbox:()=>Nl,vModelDynamic:()=>Hl,vModelRadio:()=>Fl,vModelSelect:()=>Dl,vModelText:()=>jl,vShow:()=>Ya,version:()=>ga,warn:()=>ma,watch:()=>Fi,watchEffect:()=>Ii,watchPostEffect:()=>ji,watchSyncEffect:()=>Ni,withAsyncContext:()=>bo,withCtx:()=>Qn,withDefaults:()=>co,withDirectives:()=>Xn,withKeys:()=>Yl,withMemo:()=>ha,withModifiers:()=>Zl,withScopeId:()=>Jn});var o={};function i(e,t){const n=new Set(e.split(","));return t?e=>n.has(e.toLowerCase()):e=>n.has(e)}n.r(o),n.d(o,{hasBrowserEnv:()=>Vh,hasStandardBrowserEnv:()=>Hh,hasStandardBrowserWebWorkerEnv:()=>qh,origin:()=>zh});const s={},a=[],l=()=>{},u=()=>!1,c=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),f=e=>e.startsWith("onUpdate:"),d=Object.assign,p=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},h=Object.prototype.hasOwnProperty,v=(e,t)=>h.call(e,t),g=Array.isArray,m=e=>"[object Map]"===O(e),y=e=>"[object Set]"===O(e),b=e=>"[object Date]"===O(e),w=e=>"function"==typeof e,C=e=>"string"==typeof e,_=e=>"symbol"==typeof e,x=e=>null!==e&&"object"==typeof e,S=e=>(x(e)||w(e))&&w(e.then)&&w(e.catch),k=Object.prototype.toString,O=e=>k.call(e),E=e=>O(e).slice(8,-1),T=e=>"[object Object]"===O(e),A=e=>C(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,L=i(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),P=i("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),R=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},I=/-(\w)/g,j=R((e=>e.replace(I,((e,t)=>t?t.toUpperCase():"")))),N=/\B([A-Z])/g,M=R((e=>e.replace(N,"-$1").toLowerCase())),F=R((e=>e.charAt(0).toUpperCase()+e.slice(1))),D=R((e=>e?`on${F(e)}`:"")),B=(e,t)=>!Object.is(e,t),U=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},H=e=>{const t=parseFloat(e);return isNaN(t)?e:t},$=e=>{const t=C(e)?Number(e):NaN;return isNaN(t)?e:t};let q;const z=()=>q||(q="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{});const W={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"NEED_HYDRATION",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},Z=i("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error");function K(e){if(g(e)){const t={};for(let n=0;n{if(e){const n=e.split(G);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function X(e){let t="";if(C(e))t=e;else if(g(e))for(let n=0;nfe(e,t)))}const pe=e=>!(!e||!0!==e.__v_isRef),he=e=>C(e)?e:null==e?"":g(e)||x(e)&&(e.toString===k||!w(e.toString))?pe(e)?he(e.value):JSON.stringify(e,ve,2):String(e),ve=(e,t)=>pe(t)?ve(e,t.value):m(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n],r)=>(e[ge(t,r)+" =>"]=n,e)),{})}:y(t)?{[`Set(${t.size})`]:[...t.values()].map((e=>ge(e)))}:_(t)?ge(t):!x(t)||g(t)||T(t)?t:String(t),ge=(e,t="")=>{var n;return _(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};let me,ye;class be{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=me,!e&&me&&(this.index=(me.scopes||(me.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const t=me;try{return me=this,e()}finally{me=t}}else 0}on(){me=this}off(){me=this.parent}stop(e){if(this._active){let t,n;for(t=0,n=this.effects.length;t=4))break}1===this._dirtyLevel&&(this._dirtyLevel=0),Ne()}return this._dirtyLevel>=4}set dirty(e){this._dirtyLevel=e?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let e=Pe,t=ye;try{return Pe=!0,ye=this,this._runnings++,Oe(this),this.fn()}finally{Ee(this),this._runnings--,ye=t,Pe=e}}stop(){this.active&&(Oe(this),Ee(this),this.onStop&&this.onStop(),this.active=!1)}}function ke(e){return e.value}function Oe(e){e._trackId++,e._depsLength=0}function Ee(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{n.dirty&&n.run()}));t&&(d(n,t),t.scope&&Ce(n,t.scope)),t&&t.lazy||n.run();const r=n.run.bind(n);return r.effect=n,r}function Le(e){e.effect.stop()}let Pe=!0,Re=0;const Ie=[];function je(){Ie.push(Pe),Pe=!1}function Ne(){const e=Ie.pop();Pe=void 0===e||e}function Me(){Re++}function Fe(){for(Re--;!Re&&Be.length;)Be.shift()()}function De(e,t,n){if(t.get(e)!==e._trackId){t.set(e,e._trackId);const n=e.deps[e._depsLength];n!==t?(n&&Te(n,e),e.deps[e._depsLength++]=t):e._depsLength++}}const Be=[];function Ue(e,t,n){Me();for(const n of e.keys()){let r;n._dirtyLevel{const n=new Map;return n.cleanup=e,n.computed=t,n},He=new WeakMap,$e=Symbol(""),qe=Symbol("");function ze(e,t,n){if(Pe&&ye){let t=He.get(e);t||He.set(e,t=new Map);let r=t.get(n);r||t.set(n,r=Ve((()=>t.delete(n)))),De(ye,r)}}function We(e,t,n,r,o,i){const s=He.get(e);if(!s)return;let a=[];if("clear"===t)a=[...s.values()];else if("length"===n&&g(e)){const e=Number(r);s.forEach(((t,n)=>{("length"===n||!_(n)&&n>=e)&&a.push(t)}))}else switch(void 0!==n&&a.push(s.get(n)),t){case"add":g(e)?A(n)&&a.push(s.get("length")):(a.push(s.get($e)),m(e)&&a.push(s.get(qe)));break;case"delete":g(e)||(a.push(s.get($e)),m(e)&&a.push(s.get(qe)));break;case"set":m(e)&&a.push(s.get($e))}Me();for(const e of a)e&&Ue(e,4);Fe()}const Ze=i("__proto__,__v_isRef,__isVue"),Ke=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter(_)),Ye=Ge();function Ge(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=Ut(this);for(let e=0,t=this.length;e{e[t]=function(...e){je(),Me();const n=Ut(this)[t].apply(this,e);return Fe(),Ne(),n}})),e}function Je(e){_(e)||(e=String(e));const t=Ut(this);return ze(t,0,e),t.hasOwnProperty(e)}class Qe{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){const r=this._isReadonly,o=this._isShallow;if("__v_isReactive"===t)return!r;if("__v_isReadonly"===t)return r;if("__v_isShallow"===t)return o;if("__v_raw"===t)return n===(r?o?Lt:At:o?Tt:Et).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const i=g(e);if(!r){if(i&&v(Ye,t))return Reflect.get(Ye,t,n);if("hasOwnProperty"===t)return Je}const s=Reflect.get(e,t,n);return(_(t)?Ke.has(t):Ze(t))?s:(r||ze(e,0,t),o?s:Kt(s)?i&&A(t)?s:s.value:x(s)?r?It(s):Pt(s):s)}}class Xe extends Qe{constructor(e=!1){super(!1,e)}set(e,t,n,r){let o=e[t];if(!this._isShallow){const t=Ft(o);if(Dt(n)||Ft(n)||(o=Ut(o),n=Ut(n)),!g(e)&&Kt(o)&&!Kt(n))return!t&&(o.value=n,!0)}const i=g(e)&&A(t)?Number(t)e,st=e=>Reflect.getPrototypeOf(e);function at(e,t,n=!1,r=!1){const o=Ut(e=e.__v_raw),i=Ut(t);n||(B(t,i)&&ze(o,0,t),ze(o,0,i));const{has:s}=st(o),a=r?it:n?$t:Ht;return s.call(o,t)?a(e.get(t)):s.call(o,i)?a(e.get(i)):void(e!==o&&e.get(t))}function lt(e,t=!1){const n=this.__v_raw,r=Ut(n),o=Ut(e);return t||(B(e,o)&&ze(r,0,e),ze(r,0,o)),e===o?n.has(e):n.has(e)||n.has(o)}function ut(e,t=!1){return e=e.__v_raw,!t&&ze(Ut(e),0,$e),Reflect.get(e,"size",e)}function ct(e,t=!1){t||Dt(e)||Ft(e)||(e=Ut(e));const n=Ut(this);return st(n).has.call(n,e)||(n.add(e),We(n,"add",e,e)),this}function ft(e,t,n=!1){n||Dt(t)||Ft(t)||(t=Ut(t));const r=Ut(this),{has:o,get:i}=st(r);let s=o.call(r,e);s||(e=Ut(e),s=o.call(r,e));const a=i.call(r,e);return r.set(e,t),s?B(t,a)&&We(r,"set",e,t):We(r,"add",e,t),this}function dt(e){const t=Ut(this),{has:n,get:r}=st(t);let o=n.call(t,e);o||(e=Ut(e),o=n.call(t,e));r&&r.call(t,e);const i=t.delete(e);return o&&We(t,"delete",e,void 0),i}function pt(){const e=Ut(this),t=0!==e.size,n=e.clear();return t&&We(e,"clear",void 0,void 0),n}function ht(e,t){return function(n,r){const o=this,i=o.__v_raw,s=Ut(i),a=t?it:e?$t:Ht;return!e&&ze(s,0,$e),i.forEach(((e,t)=>n.call(r,a(e),a(t),o)))}}function vt(e,t,n){return function(...r){const o=this.__v_raw,i=Ut(o),s=m(i),a="entries"===e||e===Symbol.iterator&&s,l="keys"===e&&s,u=o[e](...r),c=n?it:t?$t:Ht;return!t&&ze(i,0,l?qe:$e),{next(){const{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:a?[c(e[0]),c(e[1])]:c(e),done:t}},[Symbol.iterator](){return this}}}}function gt(e){return function(...t){return"delete"!==e&&("clear"===e?void 0:this)}}function mt(){const e={get(e){return at(this,e)},get size(){return ut(this)},has:lt,add:ct,set:ft,delete:dt,clear:pt,forEach:ht(!1,!1)},t={get(e){return at(this,e,!1,!0)},get size(){return ut(this)},has:lt,add(e){return ct.call(this,e,!0)},set(e,t){return ft.call(this,e,t,!0)},delete:dt,clear:pt,forEach:ht(!1,!0)},n={get(e){return at(this,e,!0)},get size(){return ut(this,!0)},has(e){return lt.call(this,e,!0)},add:gt("add"),set:gt("set"),delete:gt("delete"),clear:gt("clear"),forEach:ht(!0,!1)},r={get(e){return at(this,e,!0,!0)},get size(){return ut(this,!0)},has(e){return lt.call(this,e,!0)},add:gt("add"),set:gt("set"),delete:gt("delete"),clear:gt("clear"),forEach:ht(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((o=>{e[o]=vt(o,!1,!1),n[o]=vt(o,!0,!1),t[o]=vt(o,!1,!0),r[o]=vt(o,!0,!0)})),[e,n,t,r]}const[yt,bt,wt,Ct]=mt();function _t(e,t){const n=t?e?Ct:wt:e?bt:yt;return(t,r,o)=>"__v_isReactive"===r?!e:"__v_isReadonly"===r?e:"__v_raw"===r?t:Reflect.get(v(n,r)&&r in t?n:t,r,o)}const xt={get:_t(!1,!1)},St={get:_t(!1,!0)},kt={get:_t(!0,!1)},Ot={get:_t(!0,!0)};const Et=new WeakMap,Tt=new WeakMap,At=new WeakMap,Lt=new WeakMap;function Pt(e){return Ft(e)?e:Nt(e,!1,tt,xt,Et)}function Rt(e){return Nt(e,!1,rt,St,Tt)}function It(e){return Nt(e,!0,nt,kt,At)}function jt(e){return Nt(e,!0,ot,Ot,Lt)}function Nt(e,t,n,r,o){if(!x(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const s=function(e){return e.__v_skip||!Object.isExtensible(e)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}(E(e))}(e);if(0===s)return e;const a=new Proxy(e,2===s?r:n);return o.set(e,a),a}function Mt(e){return Ft(e)?Mt(e.__v_raw):!(!e||!e.__v_isReactive)}function Ft(e){return!(!e||!e.__v_isReadonly)}function Dt(e){return!(!e||!e.__v_isShallow)}function Bt(e){return!!e&&!!e.__v_raw}function Ut(e){const t=e&&e.__v_raw;return t?Ut(t):e}function Vt(e){return Object.isExtensible(e)&&V(e,"__v_skip",!0),e}const Ht=e=>x(e)?Pt(e):e,$t=e=>x(e)?It(e):e;class qt{constructor(e,t,n,r){this.getter=e,this._setter=t,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Se((()=>e(this._value)),(()=>Zt(this,2===this.effect._dirtyLevel?2:3))),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=Ut(this);return e._cacheable&&!e.effect.dirty||!B(e._value,e._value=e.effect.run())||Zt(e,4),Wt(e),e.effect._dirtyLevel>=2&&Zt(e,2),e._value}set value(e){this._setter(e)}get _dirty(){return this.effect.dirty}set _dirty(e){this.effect.dirty=e}}function zt(e,t,n=!1){let r,o;const i=w(e);i?(r=e,o=l):(r=e.get,o=e.set);return new qt(r,o,i||!o,n)}function Wt(e){var t;Pe&&ye&&(e=Ut(e),De(ye,null!=(t=e.dep)?t:e.dep=Ve((()=>e.dep=void 0),e instanceof qt?e:void 0)))}function Zt(e,t=4,n,r){const o=(e=Ut(e)).dep;o&&Ue(o,t)}function Kt(e){return!(!e||!0!==e.__v_isRef)}function Yt(e){return Jt(e,!1)}function Gt(e){return Jt(e,!0)}function Jt(e,t){return Kt(e)?e:new Qt(e,t)}class Qt{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:Ut(e),this._value=t?e:Ht(e)}get value(){return Wt(this),this._value}set value(e){const t=this.__v_isShallow||Dt(e)||Ft(e);if(e=t?e:Ut(e),B(e,this._rawValue)){this._rawValue;this._rawValue=e,this._value=t?e:Ht(e),Zt(this,4)}}}function Xt(e){Zt(e,4)}function en(e){return Kt(e)?e.value:e}function tn(e){return w(e)?e():en(e)}const nn={get:(e,t,n)=>en(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Kt(o)&&!Kt(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function rn(e){return Mt(e)?e:new Proxy(e,nn)}class on{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Wt(this)),(()=>Zt(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function sn(e){return new on(e)}function an(e){const t=g(e)?new Array(e.length):{};for(const n in e)t[n]=fn(e,n);return t}class ln{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return function(e,t){const n=He.get(e);return n&&n.get(t)}(Ut(this._object),this._key)}}class un{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function cn(e,t,n){return Kt(e)?e:w(e)?new un(e):x(e)&&arguments.length>1?fn(e,t,n):Yt(e)}function fn(e,t,n){const r=e[t];return Kt(r)?r:new ln(e,t,n)}const dn={GET:"get",HAS:"has",ITERATE:"iterate"},pn={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},hn=[];let vn=!1;function gn(e,...t){if(vn)return;vn=!0,je();const n=hn.length?hn[hn.length-1].component:null,r=n&&n.appContext.config.warnHandler,o=function(){let e=hn[hn.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const r=e.component&&e.component.parent;e=r&&r.vnode}return t}();if(r)_n(r,n,11,[e+t.map((e=>{var t,n;return null!=(n=null==(t=e.toString)?void 0:t.call(e))?n:JSON.stringify(e)})).join(""),n&&n.proxy,o.map((({vnode:e})=>`at <${ua(n,e.type)}>`)).join("\n"),o]);else{const n=[`[Vue warn]: ${e}`,...t];o.length&&n.push("\n",...function(e){const t=[];return e.forEach(((e,n)=>{t.push(...0===n?[]:["\n"],...function({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",r=!!e.component&&null==e.component.parent,o=` at <${ua(e.component,e.type,r)}`,i=">"+n;return e.props?[o,...mn(e.props),i]:[o+i]}(e))})),t}(o))}Ne(),vn=!1}function mn(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach((n=>{t.push(...yn(n,e[n]))})),n.length>3&&t.push(" ..."),t}function yn(e,t,n){return C(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):"number"==typeof t||"boolean"==typeof t||null==t?n?t:[`${e}=${t}`]:Kt(t)?(t=yn(e,Ut(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):w(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=Ut(t),n?t:[`${e}=`,t])}function bn(e,t){}const wn={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",WATCH_GETTER:2,2:"WATCH_GETTER",WATCH_CALLBACK:3,3:"WATCH_CALLBACK",WATCH_CLEANUP:4,4:"WATCH_CLEANUP",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE"},Cn={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update"};function _n(e,t,n,r){try{return r?e(...r):e()}catch(e){Sn(e,t,n)}}function xn(e,t,n,r){if(w(e)){const o=_n(e,t,n,r);return o&&S(o)&&o.catch((e=>{Sn(e,t,n)})),o}if(g(e)){const o=[];for(let i=0;i>>1,o=En[r],i=Un(o);iUn(e)-Un(t)));if(An.length=0,Ln)return void Ln.push(...e);for(Ln=e,Pn=0;Pnnull==e.id?1/0:e.id,Vn=(e,t)=>{const n=Un(e)-Un(t);if(0===n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Hn(e){On=!1,kn=!0,En.sort(Vn);try{for(Tn=0;TnQn;function Qn(e,t=Wn,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&ms(-1);const o=Kn(t);let i;try{i=e(...n)}finally{Kn(o),r._d&&ms(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Xn(e,t){if(null===Wn)return e;const n=ia(Wn),r=e.dirs||(e.dirs=[]);for(let e=0;e{e.isMounted=!0})),jr((()=>{e.isUnmounting=!0})),e}const or=[Function,Array],ir={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:or,onEnter:or,onAfterEnter:or,onEnterCancelled:or,onBeforeLeave:or,onLeave:or,onAfterLeave:or,onLeaveCancelled:or,onBeforeAppear:or,onAppear:or,onAfterAppear:or,onAppearCancelled:or},sr=e=>{const t=e.subTree;return t.component?sr(t.component):t},ar={name:"BaseTransition",props:ir,setup(e,{slots:t}){const n=$s(),r=rr();return()=>{const o=t.default&&pr(t.default(),!0);if(!o||!o.length)return;let i=o[0];if(o.length>1){let e=!1;for(const t of o)if(t.type!==us){0,i=t,e=!0;break}}const s=Ut(e),{mode:a}=s;if(r.isLeaving)return cr(i);const l=fr(i);if(!l)return cr(i);let u=ur(l,s,r,n,(e=>u=e));dr(l,u);const c=n.subTree,f=c&&fr(c);if(f&&f.type!==us&&!_s(l,f)&&sr(n).type!==us){const e=ur(f,s,r,n);if(dr(f,e),"out-in"===a&&l.type!==us)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,!1!==n.update.active&&(n.effect.dirty=!0,n.update())},cr(i);"in-out"===a&&l.type!==us&&(e.delayLeave=(e,t,n)=>{lr(r,f)[String(f.key)]=f,e[tr]=()=>{t(),e[tr]=void 0,delete u.delayedLeave},u.delayedLeave=n})}return i}}};function lr(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function ur(e,t,n,r,o){const{appear:i,mode:s,persisted:a=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:d,onLeave:p,onAfterLeave:h,onLeaveCancelled:v,onBeforeAppear:m,onAppear:y,onAfterAppear:b,onAppearCancelled:w}=t,C=String(e.key),_=lr(n,e),x=(e,t)=>{e&&xn(e,r,9,t)},S=(e,t)=>{const n=t[1];x(e,t),g(e)?e.every((e=>e.length<=1))&&n():e.length<=1&&n()},k={mode:s,persisted:a,beforeEnter(t){let r=l;if(!n.isMounted){if(!i)return;r=m||l}t[tr]&&t[tr](!0);const o=_[C];o&&_s(e,o)&&o.el[tr]&&o.el[tr](),x(r,[t])},enter(e){let t=u,r=c,o=f;if(!n.isMounted){if(!i)return;t=y||u,r=b||c,o=w||f}let s=!1;const a=e[nr]=t=>{s||(s=!0,x(t?o:r,[e]),k.delayedLeave&&k.delayedLeave(),e[nr]=void 0)};t?S(t,[e,a]):a()},leave(t,r){const o=String(e.key);if(t[nr]&&t[nr](!0),n.isUnmounting)return r();x(d,[t]);let i=!1;const s=t[tr]=n=>{i||(i=!0,r(),x(n?v:h,[t]),t[tr]=void 0,_[o]===e&&delete _[o])};_[o]=e,p?S(p,[t,s]):s()},clone(e){const i=ur(e,t,n,r,o);return o&&o(i),i}};return k}function cr(e){if(yr(e))return(e=Ls(e)).children=null,e}function fr(e){if(!yr(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(16&t)return n[0];if(32&t&&w(n.default))return n.default()}}function dr(e,t){6&e.shapeFlag&&e.component?dr(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function pr(e,t=!1,n){let r=[],o=0;for(let i=0;i1)for(let e=0;ed({name:e.name},t,{setup:e}))():e}const vr=e=>!!e.type.__asyncLoader;function gr(e){w(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:i,suspensible:s=!0,onError:a}=e;let l,u=null,c=0;const f=()=>{let e;return u||(e=u=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),a)return new Promise(((t,n)=>{a(e,(()=>t((c++,u=null,f()))),(()=>n(e)),c+1)}));throw e})).then((t=>e!==u&&u?u:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),l=t,t))))};return hr({name:"AsyncComponentWrapper",__asyncLoader:f,get __asyncResolved(){return l},setup(){const e=Hs;if(l)return()=>mr(l,e);const t=t=>{u=null,Sn(t,e,13,!r)};if(s&&e.suspense||Js)return f().then((t=>()=>mr(t,e))).catch((e=>(t(e),()=>r?Es(r,{error:e}):null)));const a=Yt(!1),c=Yt(),d=Yt(!!o);return o&&setTimeout((()=>{d.value=!1}),o),null!=i&&setTimeout((()=>{if(!a.value&&!c.value){const e=new Error(`Async component timed out after ${i}ms.`);t(e),c.value=e}}),i),f().then((()=>{a.value=!0,e.parent&&yr(e.parent.vnode)&&(e.parent.effect.dirty=!0,Nn(e.parent.update))})).catch((e=>{t(e),c.value=e})),()=>a.value&&l?mr(l,e):c.value&&r?Es(r,{error:c.value}):n&&!d.value?Es(n):void 0}})}function mr(e,t){const{ref:n,props:r,children:o,ce:i}=t.vnode,s=Es(e,r,o);return s.ref=n,s.ce=i,delete t.vnode.ce,s}const yr=e=>e.type.__isKeepAlive,br={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=$s(),r=n.ctx;if(!r.renderer)return()=>{const e=t.default&&t.default();return e&&1===e.length?e[0]:e};const o=new Map,i=new Set;let s=null;const a=n.suspense,{renderer:{p:l,m:u,um:c,o:{createElement:f}}}=r,d=f("div");function p(e){Or(e),c(e,n,a,!0)}function h(e){o.forEach(((t,n)=>{const r=la(t.type);!r||e&&e(r)||v(n)}))}function v(e){const t=o.get(e);!t||s&&_s(t,s)?s&&Or(s):p(t),o.delete(e),i.delete(e)}r.activate=(e,t,n,r,o)=>{const i=e.component;u(e,t,n,0,a),l(i.vnode,e,t,n,i,a,r,e.slotScopeIds,o),Ci((()=>{i.isDeactivated=!1,i.a&&U(i.a);const t=e.props&&e.props.onVnodeMounted;t&&Ds(t,i.parent,e)}),a)},r.deactivate=e=>{const t=e.component;Li(t.m),Li(t.a),u(e,d,null,1,a),Ci((()=>{t.da&&U(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&Ds(n,t.parent,e),t.isDeactivated=!0}),a)},Fi((()=>[e.include,e.exclude]),(([e,t])=>{e&&h((t=>Cr(e,t))),t&&h((e=>!Cr(t,e)))}),{flush:"post",deep:!0});let g=null;const m=()=>{null!=g&&(Xi(n.subTree.type)?Ci((()=>{o.set(g,Er(n.subTree))}),n.subTree.suspense):o.set(g,Er(n.subTree)))};return Pr(m),Ir(m),jr((()=>{o.forEach((e=>{const{subTree:t,suspense:r}=n,o=Er(t);if(e.type!==o.type||e.key!==o.key)p(e);else{Or(o);const e=o.component.da;e&&Ci(e,r)}}))})),()=>{if(g=null,!t.default)return null;const n=t.default(),r=n[0];if(n.length>1)return s=null,n;if(!(Cs(r)&&(4&r.shapeFlag||128&r.shapeFlag)))return s=null,r;let a=Er(r);if(a.type===us)return s=null,a;const l=a.type,u=la(vr(a)?a.type.__asyncResolved||{}:l),{include:c,exclude:f,max:d}=e;if(c&&(!u||!Cr(c,u))||f&&u&&Cr(f,u))return s=a,r;const p=null==a.key?l:a.key,h=o.get(p);return a.el&&(a=Ls(a),128&r.shapeFlag&&(r.ssContent=a)),g=p,h?(a.el=h.el,a.component=h.component,a.transition&&dr(a,a.transition),a.shapeFlag|=512,i.delete(p),i.add(p)):(i.add(p),d&&i.size>parseInt(d,10)&&v(i.values().next().value)),a.shapeFlag|=256,s=a,Xi(r.type)?r:a}}},wr=br;function Cr(e,t){return g(e)?e.some((e=>Cr(e,t))):C(e)?e.split(",").includes(t):"[object RegExp]"===O(e)&&e.test(t)}function _r(e,t){Sr(e,"a",t)}function xr(e,t){Sr(e,"da",t)}function Sr(e,t,n=Hs){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(Tr(t,r,n),n){let e=n.parent;for(;e&&e.parent;)yr(e.parent.vnode)&&kr(r,t,n,e),e=e.parent}}function kr(e,t,n,r){const o=Tr(t,e,r,!0);Nr((()=>{p(r[t],o)}),n)}function Or(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Er(e){return 128&e.shapeFlag?e.ssContent:e}function Tr(e,t,n=Hs,r=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{je();const o=Ws(n),i=xn(t,n,e,r);return o(),Ne(),i});return r?o.unshift(i):o.push(i),i}}const Ar=e=>(t,n=Hs)=>{Js&&"sp"!==e||Tr(e,((...e)=>t(...e)),n)},Lr=Ar("bm"),Pr=Ar("m"),Rr=Ar("bu"),Ir=Ar("u"),jr=Ar("bum"),Nr=Ar("um"),Mr=Ar("sp"),Fr=Ar("rtg"),Dr=Ar("rtc");function Br(e,t=Hs){Tr("ec",e,t)}const Ur="components",Vr="directives";function Hr(e,t){return Wr(Ur,e,!0,t)||e}const $r=Symbol.for("v-ndc");function qr(e){return C(e)?Wr(Ur,e,!1)||e:e||$r}function zr(e){return Wr(Vr,e)}function Wr(e,t,n=!0,r=!1){const o=Wn||Hs;if(o){const n=o.type;if(e===Ur){const e=la(n,!1);if(e&&(e===t||e===j(t)||e===F(j(t))))return n}const i=Zr(o[e]||n[e],t)||Zr(o.appContext[e],t);return!i&&r?n:i}}function Zr(e,t){return e&&(e[t]||e[j(t)]||e[F(j(t))])}function Kr(e,t,n,r){let o;const i=n&&n[r];if(g(e)||C(e)){o=new Array(e.length);for(let n=0,r=e.length;nt(e,n,void 0,i&&i[n])));else{const n=Object.keys(e);o=new Array(n.length);for(let r=0,s=n.length;r{const t=r.fn(...e);return t&&(t.key=r.key),t}:r.fn)}return e}function Gr(e,t,n={},r,o){if(Wn.isCE||Wn.parent&&vr(Wn.parent)&&Wn.parent.isCE)return"default"!==t&&(n.name=t),Es("slot",n,r&&r());let i=e[t];i&&i._c&&(i._d=!1),ps();const s=i&&Jr(i(n)),a=ws(as,{key:(n.key||s&&s.key||`_${t}`)+(!s&&r?"_fb":"")},s||(r?r():[]),s&&1===e._?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),i&&i._c&&(i._d=!0),a}function Jr(e){return e.some((e=>!Cs(e)||e.type!==us&&!(e.type===as&&!Jr(e.children))))?e:null}function Qr(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:D(r)]=e[r];return n}const Xr=e=>e?Ks(e)?ia(e):Xr(e.parent):null,eo=d(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Xr(e.parent),$root:e=>Xr(e.root),$emit:e=>e.emit,$options:e=>So(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Nn(e.update)}),$nextTick:e=>e.n||(e.n=jn.bind(e.proxy)),$watch:e=>Bi.bind(e)}),to=(e,t)=>e!==s&&!e.__isScriptSetup&&v(e,t),no={get({_:e},t){if("__v_skip"===t)return!0;const{ctx:n,setupState:r,data:o,props:i,accessCache:a,type:l,appContext:u}=e;let c;if("$"!==t[0]){const l=a[t];if(void 0!==l)switch(l){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(to(r,t))return a[t]=1,r[t];if(o!==s&&v(o,t))return a[t]=2,o[t];if((c=e.propsOptions[0])&&v(c,t))return a[t]=3,i[t];if(n!==s&&v(n,t))return a[t]=4,n[t];wo&&(a[t]=0)}}const f=eo[t];let d,p;return f?("$attrs"===t&&ze(e.attrs,0,""),f(e)):(d=l.__cssModules)&&(d=d[t])?d:n!==s&&v(n,t)?(a[t]=4,n[t]):(p=u.config.globalProperties,v(p,t)?p[t]:void 0)},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return to(o,t)?(o[t]=n,!0):r!==s&&v(r,t)?(r[t]=n,!0):!v(e.props,t)&&(("$"!==t[0]||!(t.slice(1)in e))&&(i[t]=n,!0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:i}},a){let l;return!!n[a]||e!==s&&v(e,a)||to(t,a)||(l=i[0])&&v(l,a)||v(r,a)||v(eo,a)||v(o.config.globalProperties,a)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:v(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};const ro=d({},no,{get(e,t){if(t!==Symbol.unscopables)return no.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!Z(t)});function oo(){return null}function io(){return null}function so(e){0}function ao(e){0}function lo(){return null}function uo(){0}function co(e,t){return null}function fo(){return ho().slots}function po(){return ho().attrs}function ho(){const e=$s();return e.setupContext||(e.setupContext=oa(e))}function vo(e){return g(e)?e.reduce(((e,t)=>(e[t]=null,e)),{}):e}function go(e,t){const n=vo(e);for(const e in t){if(e.startsWith("__skip"))continue;let r=n[e];r?g(r)||w(r)?r=n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(r=n[e]={default:t[e]}),r&&t[`__skip_${e}`]&&(r.skipFactory=!0)}return n}function mo(e,t){return e&&t?g(e)&&g(t)?e.concat(t):d({},vo(e),vo(t)):e||t}function yo(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function bo(e){const t=$s();let n=e();return Zs(),S(n)&&(n=n.catch((e=>{throw Ws(t),e}))),[n,()=>Ws(t)]}let wo=!0;function Co(e){const t=So(e),n=e.proxy,r=e.ctx;wo=!1,t.beforeCreate&&_o(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:s,watch:a,provide:u,inject:c,created:f,beforeMount:d,mounted:p,beforeUpdate:h,updated:v,activated:m,deactivated:y,beforeDestroy:b,beforeUnmount:C,destroyed:_,unmounted:S,render:k,renderTracked:O,renderTriggered:E,errorCaptured:T,serverPrefetch:A,expose:L,inheritAttrs:P,components:R,directives:I,filters:j}=t;if(c&&function(e,t){g(e)&&(e=To(e));for(const n in e){const r=e[n];let o;o=x(r)?"default"in r?Fo(r.from||n,r.default,!0):Fo(r.from||n):Fo(r),Kt(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:e=>o.value=e}):t[n]=o}}(c,r,null),s)for(const e in s){const t=s[e];w(t)&&(r[e]=t.bind(n))}if(o){0;const t=o.call(n,n);0,x(t)&&(e.data=Pt(t))}if(wo=!0,i)for(const e in i){const t=i[e],o=w(t)?t.bind(n,n):w(t.get)?t.get.bind(n,n):l;0;const s=!w(t)&&w(t.set)?t.set.bind(n):l,a=fa({get:o,set:s});Object.defineProperty(r,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(a)for(const e in a)xo(a[e],r,n,e);if(u){const e=w(u)?u.call(n):u;Reflect.ownKeys(e).forEach((t=>{Mo(t,e[t])}))}function N(e,t){g(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(f&&_o(f,e,"c"),N(Lr,d),N(Pr,p),N(Rr,h),N(Ir,v),N(_r,m),N(xr,y),N(Br,T),N(Dr,O),N(Fr,E),N(jr,C),N(Nr,S),N(Mr,A),g(L))if(L.length){const t=e.exposed||(e.exposed={});L.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});k&&e.render===l&&(e.render=k),null!=P&&(e.inheritAttrs=P),R&&(e.components=R),I&&(e.directives=I)}function _o(e,t,n){xn(g(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function xo(e,t,n,r){const o=r.includes(".")?Ui(n,r):()=>n[r];if(C(e)){const n=t[e];w(n)&&Fi(o,n)}else if(w(e))Fi(o,e.bind(n));else if(x(e))if(g(e))e.forEach((e=>xo(e,t,n,r)));else{const r=w(e.handler)?e.handler.bind(n):t[e.handler];w(r)&&Fi(o,r,e)}else 0}function So(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:s}}=e.appContext,a=i.get(t);let l;return a?l=a:o.length||n||r?(l={},o.length&&o.forEach((e=>ko(l,e,s,!0))),ko(l,t,s)):l=t,x(t)&&i.set(t,l),l}function ko(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&ko(e,i,n,!0),o&&o.forEach((t=>ko(e,t,n,!0)));for(const o in t)if(r&&"expose"===o);else{const r=Oo[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const Oo={data:Eo,props:Po,emits:Po,methods:Lo,computed:Lo,beforeCreate:Ao,created:Ao,beforeMount:Ao,mounted:Ao,beforeUpdate:Ao,updated:Ao,beforeDestroy:Ao,beforeUnmount:Ao,destroyed:Ao,unmounted:Ao,activated:Ao,deactivated:Ao,errorCaptured:Ao,serverPrefetch:Ao,components:Lo,directives:Lo,watch:function(e,t){if(!e)return t;if(!t)return e;const n=d(Object.create(null),e);for(const r in t)n[r]=Ao(e[r],t[r]);return n},provide:Eo,inject:function(e,t){return Lo(To(e),To(t))}};function Eo(e,t){return t?e?function(){return d(w(e)?e.call(this,this):e,w(t)?t.call(this,this):t)}:t:e}function To(e){if(g(e)){const t={};for(let n=0;n(i.has(e)||(e&&w(e.install)?(i.add(e),e.install(a,...t)):w(e)&&(i.add(e),e(a,...t))),a),mixin:e=>(o.mixins.includes(e)||o.mixins.push(e),a),component:(e,t)=>t?(o.components[e]=t,a):o.components[e],directive:(e,t)=>t?(o.directives[e]=t,a):o.directives[e],mount(i,l,u){if(!s){0;const c=Es(n,r);return c.appContext=o,!0===u?u="svg":!1===u&&(u=void 0),l&&t?t(c,i):e(c,i,u),s=!0,a._container=i,i.__vue_app__=a,ia(c.component)}},unmount(){s&&(e(null,a._container),delete a._container.__vue_app__)},provide:(e,t)=>(o.provides[e]=t,a),runWithContext(e){const t=No;No=a;try{return e()}finally{No=t}}};return a}}let No=null;function Mo(e,t){if(Hs){let n=Hs.provides;const r=Hs.parent&&Hs.parent.provides;r===n&&(n=Hs.provides=Object.create(r)),n[e]=t}else 0}function Fo(e,t,n=!1){const r=Hs||Wn;if(r||No){const o=No?No._context.provides:r?null==r.parent?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides:void 0;if(o&&e in o)return o[e];if(arguments.length>1)return n&&w(t)?t.call(r&&r.proxy):t}else 0}function Do(){return!!(Hs||Wn||No)}const Bo={},Uo=()=>Object.create(Bo),Vo=e=>Object.getPrototypeOf(e)===Bo;function Ho(e,t,n,r){const[o,i]=e.propsOptions;let a,l=!1;if(t)for(let s in t){if(L(s))continue;const u=t[s];let c;o&&v(o,c=j(s))?i&&i.includes(c)?(a||(a={}))[c]=u:n[c]=u:Wi(e.emitsOptions,s)||s in r&&u===r[s]||(r[s]=u,l=!0)}if(i){const t=Ut(n),r=a||s;for(let s=0;s{c=!0;const[n,r]=zo(e,t,!0);d(l,n),r&&u.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!i&&!c)return x(e)&&r.set(e,a),a;if(g(i))for(let e=0;e"_"===e[0]||"$stable"===e,Ko=e=>g(e)?e.map(js):[js(e)],Yo=(e,t,n)=>{if(t._n)return t;const r=Qn(((...e)=>Ko(t(...e))),n);return r._c=!1,r},Go=(e,t,n)=>{const r=e._ctx;for(const n in e){if(Zo(n))continue;const o=e[n];if(w(o))t[n]=Yo(0,o,r);else if(null!=o){0;const e=Ko(o);t[n]=()=>e}}},Jo=(e,t)=>{const n=Ko(t);e.slots.default=()=>n},Qo=(e,t,n)=>{for(const r in t)(n||"_"!==r)&&(e[r]=t[r])},Xo=(e,t,n)=>{const r=e.slots=Uo();if(32&e.vnode.shapeFlag){const e=t._;e?(Qo(r,t,n),n&&V(r,"_",e,!0)):Go(t,r)}else t&&Jo(e,t)},ei=(e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,a=s;if(32&r.shapeFlag){const e=t._;e?n&&1===e?i=!1:Qo(o,t,n):(i=!t.$stable,Go(t,o)),a=t}else t&&(Jo(e,t),a={default:1});if(i)for(const e in o)Zo(e)||null!=a[e]||delete o[e]};function ti(e,t,n,r,o=!1){if(g(e))return void e.forEach(((e,i)=>ti(e,t&&(g(t)?t[i]:t),n,r,o)));if(vr(r)&&!o)return;const i=4&r.shapeFlag?ia(r.component):r.el,a=o?null:i,{i:l,r:u}=e;const c=t&&t.r,f=l.refs===s?l.refs={}:l.refs,d=l.setupState;if(null!=c&&c!==u&&(C(c)?(f[c]=null,v(d,c)&&(d[c]=null)):Kt(c)&&(c.value=null)),w(u))_n(u,l,12,[a,f]);else{const t=C(u),r=Kt(u);if(t||r){const s=()=>{if(e.f){const n=t?v(d,u)?d[u]:f[u]:u.value;o?g(n)&&p(n,i):g(n)?n.includes(i)||n.push(i):t?(f[u]=[i],v(d,u)&&(d[u]=f[u])):(u.value=[i],e.k&&(f[e.k]=u.value))}else t?(f[u]=a,v(d,u)&&(d[u]=a)):r&&(u.value=a,e.k&&(f[e.k]=a))};a?(s.id=-1,Ci(s,n)):s()}else 0}}const ni=Symbol("_vte"),ri=e=>e&&(e.disabled||""===e.disabled),oi=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,ii=e=>"function"==typeof MathMLElement&&e instanceof MathMLElement,si=(e,t)=>{const n=e&&e.to;if(C(n)){if(t){return t(n)}return null}return n},ai={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,i,s,a,l,u){const{mc:c,pc:f,pbc:d,o:{insert:p,querySelector:h,createText:v,createComment:g}}=u,m=ri(t.props);let{shapeFlag:y,children:b,dynamicChildren:w}=t;if(null==e){const e=t.el=v(""),u=t.anchor=v("");p(e,n,r),p(u,n,r);const f=t.target=si(t.props,h),d=fi(f,t,v,p);f&&("svg"===s||oi(f)?s="svg":("mathml"===s||ii(f))&&(s="mathml"));const g=(e,t)=>{16&y&&c(b,e,t,o,i,s,a,l)};m?g(n,u):f&&g(f,d)}else{t.el=e.el,t.targetStart=e.targetStart;const r=t.anchor=e.anchor,c=t.target=e.target,p=t.targetAnchor=e.targetAnchor,v=ri(e.props),g=v?n:c,y=v?r:p;if("svg"===s||oi(c)?s="svg":("mathml"===s||ii(c))&&(s="mathml"),w?(d(e.dynamicChildren,w,g,o,i,s,a),Ti(e,t,!0)):l||f(e,t,g,y,o,i,s,a,!1),m)v?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):li(t,n,r,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=si(t.props,h);e&&li(t,e,null,u,0)}else v&&li(t,c,p,u,1)}ci(t)},remove(e,t,n,{um:r,o:{remove:o}},i){const{shapeFlag:s,children:a,anchor:l,targetStart:u,targetAnchor:c,target:f,props:d}=e;if(f&&(o(u),o(c)),i&&o(l),16&s){const e=i||!ri(d);for(let o=0;o{di||(di=!0)},hi=e=>(e=>e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)(e)?"svg":(e=>e.namespaceURI.includes("MathML"))(e)?"mathml":void 0,vi=e=>8===e.nodeType;function gi(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:i,parentNode:s,remove:a,insert:l,createComment:u}}=e,f=(n,r,a,u,c,b=!1)=>{b=b||!!r.dynamicChildren;const w=vi(n)&&"["===n.data,C=()=>v(n,r,a,u,c,w),{type:_,ref:x,shapeFlag:S,patchFlag:k}=r;let O=n.nodeType;r.el=n,-2===k&&(b=!1,r.dynamicChildren=null);let E=null;switch(_){case ls:3!==O?""===r.children?(l(r.el=o(""),s(n),n),E=n):E=C():(n.data!==r.children&&(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&gn("Hydration text mismatch in",n.parentNode,`\n - rendered on server: ${JSON.stringify(n.data)}\n - expected on client: ${JSON.stringify(r.children)}`),pi(),n.data=r.children),E=i(n));break;case us:y(n)?(E=i(n),m(r.el=n.content.firstChild,n,a)):E=8!==O||w?C():i(n);break;case cs:if(w&&(O=(n=i(n)).nodeType),1===O||3===O){E=n;const e=!r.children.length;for(let t=0;t{s=s||!!t.dynamicChildren;const{type:l,props:u,patchFlag:f,shapeFlag:d,dirs:h,transition:v}=t,g="input"===l||"option"===l;if(g||-1!==f){h&&er(t,null,n,"created");let l,b=!1;if(y(e)){b=Ei(o,v)&&n&&n.vnode.props&&n.vnode.props.appear;const r=e.content.firstChild;b&&v.beforeEnter(r),m(r,e,n),t.el=e=r}if(16&d&&(!u||!u.innerHTML&&!u.textContent)){let r=p(e.firstChild,t,e,n,o,i,s),l=!1;for(;r;){__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&!l&&(gn("Hydration children mismatch on",e,"\nServer rendered element contains more child nodes than client vdom."),l=!0),pi();const t=r;r=r.nextSibling,a(t)}}else 8&d&&e.textContent!==t.children&&(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&gn("Hydration text content mismatch on",e,`\n - rendered on server: ${e.textContent}\n - expected on client: ${t.children}`),pi(),e.textContent=t.children);if(u)if(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__||g||!s||48&f){const o=e.tagName.includes("-");for(const i in u)!__VUE_PROD_HYDRATION_MISMATCH_DETAILS__||h&&h.some((e=>e.dir.created))||!mi(e,i,u[i],t,n)||pi(),(g&&(i.endsWith("value")||"indeterminate"===i)||c(i)&&!L(i)||"."===i[0]||o)&&r(e,i,null,u[i],void 0,n)}else if(u.onClick)r(e,"onClick",null,u.onClick,void 0,n);else if(4&f&&Mt(u.style))for(const e in u.style)u.style[e];(l=u&&u.onVnodeBeforeMount)&&Ds(l,n,t),h&&er(t,null,n,"beforeMount"),((l=u&&u.onVnodeMounted)||h||b)&&is((()=>{l&&Ds(l,n,t),b&&v.enter(e),h&&er(t,null,n,"mounted")}),o)}return e.nextSibling},p=(e,t,r,s,a,u,c)=>{c=c||!!t.dynamicChildren;const d=t.children,p=d.length;let h=!1;for(let t=0;t{const{slotScopeIds:c}=t;c&&(o=o?o.concat(c):c);const f=s(e),d=p(i(e),t,f,n,r,o,a);return d&&vi(d)&&"]"===d.data?i(t.anchor=d):(pi(),l(t.anchor=u("]"),f,d),d)},v=(e,t,r,o,l,u)=>{if(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&gn("Hydration node mismatch:\n- rendered on server:",e,3===e.nodeType?"(text)":vi(e)&&"["===e.data?"(start of fragment)":"","\n- expected on client:",t.type),pi(),t.el=null,u){const t=g(e);for(;;){const n=i(e);if(!n||n===t)break;a(n)}}const c=i(e),f=s(e);return a(e),n(null,t,f,c,r,o,hi(f),l),c},g=(e,t="[",n="]")=>{let r=0;for(;e;)if((e=i(e))&&vi(e)&&(e.data===t&&r++,e.data===n)){if(0===r)return i(e);r--}return e},m=(e,t,n)=>{const r=t.parentNode;r&&r.replaceChild(e,t);let o=n;for(;o;)o.vnode.el===t&&(o.vnode.el=o.subTree.el=e),o=o.parent},y=e=>1===e.nodeType&&"template"===e.tagName.toLowerCase();return[(e,t)=>{if(!t.hasChildNodes())return __VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&gn("Attempting to hydrate existing markup but container is empty. Performing full mount instead."),n(null,e,t),Bn(),void(t._vnode=e);f(t.firstChild,e,null,null,null),Bn(),t._vnode=e},f]}function mi(e,t,n,r,o){let i,s,a,l;if("class"===t)a=e.getAttribute("class"),l=X(n),function(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}(yi(a||""),yi(l))||(i=s="class");else if("style"===t){a=e.getAttribute("style")||"",l=C(n)?n:function(e){let t="";if(!e||C(e))return t;for(const n in e){const r=e[n];(C(r)||"number"==typeof r)&&(t+=`${n.startsWith("--")?n:M(n)}:${r};`)}return t}(K(n));const t=bi(a),u=bi(l);if(r.dirs)for(const{dir:e,value:t}of r.dirs)"show"!==e.name||t||u.set("display","none");o&&wi(o,r,u),function(e,t){if(e.size!==t.size)return!1;for(const[n,r]of e)if(r!==t.get(n))return!1;return!0}(t,u)||(i=s="style")}else(e instanceof SVGElement&&ce(t)||e instanceof HTMLElement&&(ae(t)||ue(t)))&&(ae(t)?(a=e.hasAttribute(t),l=le(n)):null==n?(a=e.hasAttribute(t),l=!1):(a=e.hasAttribute(t)?e.getAttribute(t):"value"===t&&"TEXTAREA"===e.tagName&&e.value,l=!!function(e){if(null==e)return!1;const t=typeof e;return"string"===t||"number"===t||"boolean"===t}(n)&&String(n)),a!==l&&(i="attribute",s=t));if(i){const t=e=>!1===e?"(not rendered)":`${s}="${e}"`;return gn(`Hydration ${i} mismatch on`,e,`\n - rendered on server: ${t(a)}\n - expected on client: ${t(l)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`),!0}return!1}function yi(e){return new Set(e.trim().split(/\s+/))}function bi(e){const t=new Map;for(const n of e.split(";")){let[e,r]=n.split(":");e=e.trim(),r=r&&r.trim(),e&&r&&t.set(e,r)}return t}function wi(e,t,n){const r=e.subTree;if(e.getCssVars&&(t===r||r&&r.type===as&&r.children.includes(t))){const t=e.getCssVars();for(const e in t)n.set(`--${e}`,String(t[e]))}t===r&&e.parent&&wi(e.parent,e.vnode,n)}const Ci=is;function _i(e){return Si(e)}function xi(e){return Si(e,gi)}function Si(e,t){"boolean"!=typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&(z().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__=!1);z().__VUE__=!0;const{insert:n,remove:r,patchProp:o,createElement:i,createText:u,createComment:c,setText:f,setElementText:d,parentNode:p,nextSibling:h,setScopeId:g=l,insertStaticContent:m}=e,y=(e,t,n,r=null,o=null,i=null,s=void 0,a=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!_s(e,t)&&(r=G(e),q(e,o,i,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);const{type:u,ref:c,shapeFlag:f}=t;switch(u){case ls:b(e,t,n,r);break;case us:w(e,t,n,r);break;case cs:null==e&&C(t,n,r,s);break;case as:P(e,t,n,r,o,i,s,a,l);break;default:1&f?x(e,t,n,r,o,i,s,a,l):6&f?R(e,t,n,r,o,i,s,a,l):(64&f||128&f)&&u.process(e,t,n,r,o,i,s,a,l,X)}null!=c&&o&&ti(c,e&&e.ref,i,t||e,!t)},b=(e,t,r,o)=>{if(null==e)n(t.el=u(t.children),r,o);else{const n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},w=(e,t,r,o)=>{null==e?n(t.el=c(t.children||""),r,o):t.el=e.el},C=(e,t,n,r)=>{[e.el,e.anchor]=m(e.children,t,n,r,e.el,e.anchor)},_=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),r(e),e=n;r(t)},x=(e,t,n,r,o,i,s,a,l)=>{"svg"===t.type?s="svg":"math"===t.type&&(s="mathml"),null==e?S(t,n,r,o,i,s,a,l):E(e,t,o,i,s,a,l)},S=(e,t,r,s,a,l,u,c)=>{let f,p;const{props:h,shapeFlag:v,transition:g,dirs:m}=e;if(f=e.el=i(e.type,l,h&&h.is,h),8&v?d(f,e.children):16&v&&O(e.children,f,null,s,a,ki(e,l),u,c),m&&er(e,null,s,"created"),k(f,e,e.scopeId,u,s),h){for(const e in h)"value"===e||L(e)||o(f,e,null,h[e],l,s);"value"in h&&o(f,"value",null,h.value,l),(p=h.onVnodeBeforeMount)&&Ds(p,s,e)}m&&er(e,null,s,"beforeMount");const y=Ei(a,g);y&&g.beforeEnter(f),n(f,t,r),((p=h&&h.onVnodeMounted)||y||m)&&Ci((()=>{p&&Ds(p,s,e),y&&g.enter(f),m&&er(e,null,s,"mounted")}),a)},k=(e,t,n,r,o)=>{if(n&&g(e,n),r)for(let t=0;t{for(let u=l;u{const u=t.el=e.el;let{patchFlag:c,dynamicChildren:f,dirs:p}=t;c|=16&e.patchFlag;const h=e.props||s,v=t.props||s;let g;if(n&&Oi(n,!1),(g=v.onVnodeBeforeUpdate)&&Ds(g,n,t,e),p&&er(t,e,n,"beforeUpdate"),n&&Oi(n,!0),(h.innerHTML&&null==v.innerHTML||h.textContent&&null==v.textContent)&&d(u,""),f?T(e.dynamicChildren,f,u,n,r,ki(t,i),a):l||B(e,t,u,null,n,r,ki(t,i),a,!1),c>0){if(16&c)A(u,h,v,n,i);else if(2&c&&h.class!==v.class&&o(u,"class",null,v.class,i),4&c&&o(u,"style",h.style,v.style,i),8&c){const e=t.dynamicProps;for(let t=0;t{g&&Ds(g,n,t,e),p&&er(t,e,n,"updated")}),r)},T=(e,t,n,r,o,i,s)=>{for(let a=0;a{if(t!==n){if(t!==s)for(const s in t)L(s)||s in n||o(e,s,t[s],null,i,r);for(const s in n){if(L(s))continue;const a=n[s],l=t[s];a!==l&&"value"!==s&&o(e,s,l,a,i,r)}"value"in n&&o(e,"value",t.value,n.value,i)}},P=(e,t,r,o,i,s,a,l,c)=>{const f=t.el=e?e.el:u(""),d=t.anchor=e?e.anchor:u("");let{patchFlag:p,dynamicChildren:h,slotScopeIds:v}=t;v&&(l=l?l.concat(v):v),null==e?(n(f,r,o),n(d,r,o),O(t.children||[],r,d,i,s,a,l,c)):p>0&&64&p&&h&&e.dynamicChildren?(T(e.dynamicChildren,h,r,i,s,a,l),(null!=t.key||i&&t===i.subTree)&&Ti(e,t,!0)):B(e,t,r,d,i,s,a,l,c)},R=(e,t,n,r,o,i,s,a,l)=>{t.slotScopeIds=a,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,s,l):I(t,n,r,o,i,s,l):N(e,t,l)},I=(e,t,n,r,o,i,s)=>{const a=e.component=Vs(e,r,o);if(yr(e)&&(a.ctx.renderer=X),Qs(a,!1,s),a.asyncDep){if(o&&o.registerDep(a,F,s),!e.el){const e=a.subTree=Es(us);w(null,e,t,n)}}else F(a,e,t,n,o,i,s)},N=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:i}=e,{props:s,children:a,patchFlag:l}=t,u=i.emitsOptions;0;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return!(!o&&!a||a&&a.$stable)||r!==s&&(r?!s||Ji(r,s,u):!!s);if(1024&l)return!0;if(16&l)return r?Ji(r,s,u):!!s;if(8&l){const e=t.dynamicProps;for(let t=0;tTn&&En.splice(t,1)}(r.update),r.effect.dirty=!0,r.update()}else t.el=e.el,r.vnode=t},F=(e,t,n,r,o,i,s)=>{const a=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:l,vnode:u}=e;{const n=Ai(e);if(n)return t&&(t.el=u.el,D(e,t,s)),void n.asyncDep.then((()=>{e.isUnmounted||a()}))}let c,f=t;0,Oi(e,!1),t?(t.el=u.el,D(e,t,s)):t=u,n&&U(n),(c=t.props&&t.props.onVnodeBeforeUpdate)&&Ds(c,l,t,u),Oi(e,!0);const d=Zi(e);0;const h=e.subTree;e.subTree=d,y(h,d,p(h.el),G(h),e,o,i),t.el=d.el,null===f&&Qi(e,d.el),r&&Ci(r,o),(c=t.props&&t.props.onVnodeUpdated)&&Ci((()=>Ds(c,l,t,u)),o)}else{let s;const{el:a,props:l}=t,{bm:u,m:c,parent:f}=e,d=vr(t);if(Oi(e,!1),u&&U(u),!d&&(s=l&&l.onVnodeBeforeMount)&&Ds(s,f,t),Oi(e,!0),a&&te){const n=()=>{e.subTree=Zi(e),te(a,e.subTree,e,o,null)};d?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{0;const s=e.subTree=Zi(e);0,y(null,s,n,r,e,o,i),t.el=s.el}if(c&&Ci(c,o),!d&&(s=l&&l.onVnodeMounted)){const e=t;Ci((()=>Ds(s,f,e)),o)}(256&t.shapeFlag||f&&vr(f.vnode)&&256&f.vnode.shapeFlag)&&e.a&&Ci(e.a,o),e.isMounted=!0,t=n=r=null}},u=e.effect=new Se(a,l,(()=>Nn(c)),e.scope),c=e.update=()=>{u.dirty&&u.run()};c.i=e,c.id=e.uid,Oi(e,!0),c()},D=(e,t,n)=>{t.component=e;const r=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,r){const{props:o,attrs:i,vnode:{patchFlag:s}}=e,a=Ut(o),[l]=e.propsOptions;let u=!1;if(!(r||s>0)||16&s){let r;Ho(e,t,o,i)&&(u=!0);for(const i in a)t&&(v(t,i)||(r=M(i))!==i&&v(t,r))||(l?!n||void 0===n[i]&&void 0===n[r]||(o[i]=$o(l,a,i,void 0,e,!0)):delete o[i]);if(i!==a)for(const e in i)t&&v(t,e)||(delete i[e],u=!0)}else if(8&s){const n=e.vnode.dynamicProps;for(let r=0;r{const u=e&&e.children,c=e?e.shapeFlag:0,f=t.children,{patchFlag:p,shapeFlag:h}=t;if(p>0){if(128&p)return void H(u,f,n,r,o,i,s,a,l);if(256&p)return void V(u,f,n,r,o,i,s,a,l)}8&h?(16&c&&Y(u,o,i),f!==u&&d(n,f)):16&c?16&h?H(u,f,n,r,o,i,s,a,l):Y(u,o,i,!0):(8&c&&d(n,""),16&h&&O(f,n,r,o,i,s,a,l))},V=(e,t,n,r,o,i,s,l,u)=>{t=t||a;const c=(e=e||a).length,f=t.length,d=Math.min(c,f);let p;for(p=0;pf?Y(e,o,i,!0,!1,d):O(t,n,r,o,i,s,l,u,d)},H=(e,t,n,r,o,i,s,l,u)=>{let c=0;const f=t.length;let d=e.length-1,p=f-1;for(;c<=d&&c<=p;){const r=e[c],a=t[c]=u?Ns(t[c]):js(t[c]);if(!_s(r,a))break;y(r,a,n,null,o,i,s,l,u),c++}for(;c<=d&&c<=p;){const r=e[d],a=t[p]=u?Ns(t[p]):js(t[p]);if(!_s(r,a))break;y(r,a,n,null,o,i,s,l,u),d--,p--}if(c>d){if(c<=p){const e=p+1,a=ep)for(;c<=d;)q(e[c],o,i,!0),c++;else{const h=c,v=c,g=new Map;for(c=v;c<=p;c++){const e=t[c]=u?Ns(t[c]):js(t[c]);null!=e.key&&g.set(e.key,c)}let m,b=0;const w=p-v+1;let C=!1,_=0;const x=new Array(w);for(c=0;c=w){q(r,o,i,!0);continue}let a;if(null!=r.key)a=g.get(r.key);else for(m=v;m<=p;m++)if(0===x[m-v]&&_s(r,t[m])){a=m;break}void 0===a?q(r,o,i,!0):(x[a-v]=c+1,a>=_?_=a:C=!0,y(r,t[a],n,null,o,i,s,l,u),b++)}const S=C?function(e){const t=e.slice(),n=[0];let r,o,i,s,a;const l=e.length;for(r=0;r>1,e[n[a]]0&&(t[r]=n[i-1]),n[i]=r)}}i=n.length,s=n[i-1];for(;i-- >0;)n[i]=s,s=t[s];return n}(x):a;for(m=S.length-1,c=w-1;c>=0;c--){const e=v+c,a=t[e],d=e+1{const{el:s,type:a,transition:l,children:u,shapeFlag:c}=e;if(6&c)return void $(e.component.subTree,t,r,o);if(128&c)return void e.suspense.move(t,r,o);if(64&c)return void a.move(e,t,r,X);if(a===as){n(s,t,r);for(let e=0;e{let i;for(;e&&e!==t;)i=h(e),n(e,r,o),e=i;n(t,r,o)})(e,t,r);if(2!==o&&1&c&&l)if(0===o)l.beforeEnter(s),n(s,t,r),Ci((()=>l.enter(s)),i);else{const{leave:e,delayLeave:o,afterLeave:i}=l,a=()=>n(s,t,r),u=()=>{e(s,(()=>{a(),i&&i()}))};o?o(s,a,u):u()}else n(s,t,r)},q=(e,t,n,r=!1,o=!1)=>{const{type:i,props:s,ref:a,children:l,dynamicChildren:u,shapeFlag:c,patchFlag:f,dirs:d,cacheIndex:p}=e;if(-2===f&&(o=!1),null!=a&&ti(a,null,n,e,!0),null!=p&&(t.renderCache[p]=void 0),256&c)return void t.ctx.deactivate(e);const h=1&c&&d,v=!vr(e);let g;if(v&&(g=s&&s.onVnodeBeforeUnmount)&&Ds(g,t,e),6&c)K(e.component,n,r);else{if(128&c)return void e.suspense.unmount(n,r);h&&er(e,null,t,"beforeUnmount"),64&c?e.type.remove(e,t,n,X,r):u&&!u.hasOnce&&(i!==as||f>0&&64&f)?Y(u,t,n,!1,!0):(i===as&&384&f||!o&&16&c)&&Y(l,t,n),r&&W(e)}(v&&(g=s&&s.onVnodeUnmounted)||h)&&Ci((()=>{g&&Ds(g,t,e),h&&er(e,null,t,"unmounted")}),n)},W=e=>{const{type:t,el:n,anchor:o,transition:i}=e;if(t===as)return void Z(n,o);if(t===cs)return void _(e);const s=()=>{r(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){const{leave:t,delayLeave:r}=i,o=()=>t(n,s);r?r(e.el,s,o):o()}else s()},Z=(e,t)=>{let n;for(;e!==t;)n=h(e),r(e),e=n;r(t)},K=(e,t,n)=>{const{bum:r,scope:o,update:i,subTree:s,um:a,m:l,a:u}=e;Li(l),Li(u),r&&U(r),o.stop(),i&&(i.active=!1,q(s,e,t,n)),a&&Ci(a,t),Ci((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},Y=(e,t,n,r=!1,o=!1,i=0)=>{for(let s=i;s{if(6&e.shapeFlag)return G(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();const t=h(e.anchor||e.el),n=t&&t[ni];return n?h(n):t};let J=!1;const Q=(e,t,n)=>{null==e?t._vnode&&q(t._vnode,null,null,!0):y(t._vnode||null,e,t,null,null,null,n),t._vnode=e,J||(J=!0,Dn(),Bn(),J=!1)},X={p:y,um:q,m:$,r:W,mt:I,mc:O,pc:B,pbc:T,n:G,o:e};let ee,te;return t&&([ee,te]=t(X)),{render:Q,hydrate:ee,createApp:jo(Q,ee)}}function ki({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Oi({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Ei(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ti(e,t,n=!1){const r=e.children,o=t.children;if(g(r)&&g(o))for(let e=0;e{{const e=Fo(Pi);return e}};function Ii(e,t){return Di(e,null,t)}function ji(e,t){return Di(e,null,{flush:"post"})}function Ni(e,t){return Di(e,null,{flush:"sync"})}const Mi={};function Fi(e,t,n){return Di(e,t,n)}function Di(e,t,{immediate:n,deep:r,flush:o,once:i,onTrack:a,onTrigger:u}=s){if(t&&i){const e=t;t=(...t)=>{e(...t),O()}}const c=Hs,f=e=>!0===r?e:Vi(e,!1===r?1:void 0);let d,h,v=!1,m=!1;if(Kt(e)?(d=()=>e.value,v=Dt(e)):Mt(e)?(d=()=>f(e),v=!0):g(e)?(m=!0,v=e.some((e=>Mt(e)||Dt(e))),d=()=>e.map((e=>Kt(e)?e.value:Mt(e)?f(e):w(e)?_n(e,c,2):void 0))):d=w(e)?t?()=>_n(e,c,2):()=>(h&&h(),xn(e,c,3,[b])):l,t&&r){const e=d;d=()=>Vi(e())}let y,b=e=>{h=S.onStop=()=>{_n(e,c,4),h=S.onStop=void 0}};if(Js){if(b=l,t?n&&xn(t,c,3,[d(),m?[]:void 0,b]):d(),"sync"!==o)return l;{const e=Ri();y=e.__watcherHandles||(e.__watcherHandles=[])}}let C=m?new Array(e.length).fill(Mi):Mi;const _=()=>{if(S.active&&S.dirty)if(t){const e=S.run();(r||v||(m?e.some(((e,t)=>B(e,C[t]))):B(e,C)))&&(h&&h(),xn(t,c,3,[e,C===Mi?void 0:m&&C[0]===Mi?[]:C,b]),C=e)}else S.run()};let x;_.allowRecurse=!!t,"sync"===o?x=_:"post"===o?x=()=>Ci(_,c&&c.suspense):(_.pre=!0,c&&(_.id=c.uid),x=()=>Nn(_));const S=new Se(d,l,x),k=_e(),O=()=>{S.stop(),k&&p(k.effects,S)};return t?n?_():C=S.run():"post"===o?Ci(S.run.bind(S),c&&c.suspense):S.run(),y&&y.push(O),O}function Bi(e,t,n){const r=this.proxy,o=C(e)?e.includes(".")?Ui(r,e):()=>r[e]:e.bind(r,r);let i;w(t)?i=t:(i=t.handler,n=t);const s=Ws(this),a=Di(o,i.bind(r),n);return s(),a}function Ui(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e{Vi(e,t,n)}));else if(T(e)){for(const r in e)Vi(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Vi(e[r],t,n)}return e}function Hi(e,t,n=s){const r=$s();const o=j(t),i=M(t),a=$i(e,t),l=sn(((a,l)=>{let u,c,f=s;return Ni((()=>{const n=e[t];B(u,n)&&(u=n,l())})),{get:()=>(a(),n.get?n.get(u):u),set(e){const a=n.set?n.set(e):e;if(!(B(a,u)||f!==s&&B(e,f)))return;const d=r.vnode.props;d&&(t in d||o in d||i in d)&&(`onUpdate:${t}`in d||`onUpdate:${o}`in d||`onUpdate:${i}`in d)||(u=e,l()),r.emit(`update:${t}`,a),B(e,a)&&B(e,f)&&!B(a,c)&&l(),f=e,c=a}}}));return l[Symbol.iterator]=()=>{let e=0;return{next:()=>e<2?{value:e++?a||s:l,done:!1}:{done:!0}}},l}const $i=(e,t)=>"modelValue"===t||"model-value"===t?e.modelModifiers:e[`${t}Modifiers`]||e[`${j(t)}Modifiers`]||e[`${M(t)}Modifiers`];function qi(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||s;let o=n;const i=t.startsWith("update:"),a=i&&$i(r,t.slice(7));let l;a&&(a.trim&&(o=n.map((e=>C(e)?e.trim():e))),a.number&&(o=n.map(H)));let u=r[l=D(t)]||r[l=D(j(t))];!u&&i&&(u=r[l=D(M(t))]),u&&xn(u,e,6,o);const c=r[l+"Once"];if(c){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,xn(c,e,6,o)}}function zi(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(void 0!==o)return o;const i=e.emits;let s={},a=!1;if(!w(e)){const r=e=>{const n=zi(e,t,!0);n&&(a=!0,d(s,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return i||a?(g(i)?i.forEach((e=>s[e]=null)):d(s,i),x(e)&&r.set(e,s),s):(x(e)&&r.set(e,null),null)}function Wi(e,t){return!(!e||!c(t))&&(t=t.slice(2).replace(/Once$/,""),v(e,t[0].toLowerCase()+t.slice(1))||v(e,M(t))||v(e,t))}function Zi(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[i],slots:s,attrs:a,emit:l,render:u,renderCache:c,props:d,data:p,setupState:h,ctx:v,inheritAttrs:g}=e,m=Kn(e);let y,b;try{if(4&n.shapeFlag){const e=o||r,t=e;y=js(u.call(t,e,c,d,h,p,v)),b=a}else{const e=t;0,y=js(e.length>1?e(d,{attrs:a,slots:s,emit:l}):e(d,null)),b=t.props?a:Yi(a)}}catch(t){fs.length=0,Sn(t,e,1),y=Es(us)}let w=y;if(b&&!1!==g){const e=Object.keys(b),{shapeFlag:t}=w;e.length&&7&t&&(i&&e.some(f)&&(b=Gi(b,i)),w=Ls(w,b,!1,!0))}return n.dirs&&(w=Ls(w,null,!1,!0),w.dirs=w.dirs?w.dirs.concat(n.dirs):n.dirs),n.transition&&(w.transition=n.transition),y=w,Kn(m),y}function Ki(e,t=!0){let n;for(let t=0;t{let t;for(const n in e)("class"===n||"style"===n||c(n))&&((t||(t={}))[n]=e[n]);return t},Gi=(e,t)=>{const n={};for(const r in e)f(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function Ji(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;oe.__isSuspense;let es=0;const ts={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,s,a,l,u){if(null==e)!function(e,t,n,r,o,i,s,a,l){const{p:u,o:{createElement:c}}=l,f=c("div"),d=e.suspense=rs(e,o,r,t,f,n,i,s,a,l);u(null,d.pendingBranch=e.ssContent,f,null,r,d,i,s),d.deps>0?(ns(e,"onPending"),ns(e,"onFallback"),u(null,e.ssFallback,t,n,r,null,i,s),ss(d,e.ssFallback)):d.resolve(!1,!0)}(t,n,r,o,i,s,a,l,u);else{if(i&&i.deps>0&&!e.suspense.isInFallback)return t.suspense=e.suspense,t.suspense.vnode=t,void(t.el=e.el);!function(e,t,n,r,o,i,s,a,{p:l,um:u,o:{createElement:c}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,p=t.ssFallback,{activeBranch:h,pendingBranch:v,isInFallback:g,isHydrating:m}=f;if(v)f.pendingBranch=d,_s(d,v)?(l(v,d,f.hiddenContainer,null,o,f,i,s,a),f.deps<=0?f.resolve():g&&(m||(l(h,p,n,r,o,null,i,s,a),ss(f,p)))):(f.pendingId=es++,m?(f.isHydrating=!1,f.activeBranch=v):u(v,o,f),f.deps=0,f.effects.length=0,f.hiddenContainer=c("div"),g?(l(null,d,f.hiddenContainer,null,o,f,i,s,a),f.deps<=0?f.resolve():(l(h,p,n,r,o,null,i,s,a),ss(f,p))):h&&_s(d,h)?(l(h,d,n,r,o,f,i,s,a),f.resolve(!0)):(l(null,d,f.hiddenContainer,null,o,f,i,s,a),f.deps<=0&&f.resolve()));else if(h&&_s(d,h))l(h,d,n,r,o,f,i,s,a),ss(f,d);else if(ns(t,"onPending"),f.pendingBranch=d,512&d.shapeFlag?f.pendingId=d.component.suspenseId:f.pendingId=es++,l(null,d,f.hiddenContainer,null,o,f,i,s,a),f.deps<=0)f.resolve();else{const{timeout:e,pendingId:t}=f;e>0?setTimeout((()=>{f.pendingId===t&&f.fallback(p)}),e):0===e&&f.fallback(p)}}(e,t,n,r,o,s,a,l,u)}},hydrate:function(e,t,n,r,o,i,s,a,l){const u=t.suspense=rs(t,r,n,e.parentNode,document.createElement("div"),null,o,i,s,a,!0),c=l(e,u.pendingBranch=t.ssContent,n,u,i,s);0===u.deps&&u.resolve(!1,!0);return c},normalize:function(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=os(r?n.default:n),e.ssFallback=r?os(n.fallback):Es(us)}};function ns(e,t){const n=e.props&&e.props[t];w(n)&&n()}function rs(e,t,n,r,o,i,s,a,l,u,c=!1){const{p:f,m:d,um:p,n:h,o:{parentNode:v,remove:g}}=u;let m;const y=function(e){const t=e.props&&e.props.suspensible;return null!=t&&!1!==t}(e);y&&t&&t.pendingBranch&&(m=t.pendingId,t.deps++);const b=e.props?$(e.props.timeout):void 0;const w=i,C={vnode:e,parent:t,parentComponent:n,namespace:s,container:r,hiddenContainer:o,deps:0,pendingId:es++,timeout:"number"==typeof b?b:-1,activeBranch:null,pendingBranch:null,isInFallback:!c,isHydrating:c,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){const{vnode:r,activeBranch:o,pendingBranch:s,pendingId:a,effects:l,parentComponent:u,container:c}=C;let f=!1;C.isHydrating?C.isHydrating=!1:e||(f=o&&s.transition&&"out-in"===s.transition.mode,f&&(o.transition.afterLeave=()=>{a===C.pendingId&&(d(s,c,i===w?h(o):i,0),Fn(l))}),o&&(v(o.el)!==C.hiddenContainer&&(i=h(o)),p(o,u,C,!0)),f||d(s,c,i,0)),ss(C,s),C.pendingBranch=null,C.isInFallback=!1;let g=C.parent,b=!1;for(;g;){if(g.pendingBranch){g.effects.push(...l),b=!0;break}g=g.parent}b||f||Fn(l),C.effects=[],y&&t&&t.pendingBranch&&m===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),ns(r,"onResolve")},fallback(e){if(!C.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,namespace:i}=C;ns(t,"onFallback");const s=h(n),u=()=>{C.isInFallback&&(f(null,e,o,s,r,null,i,a,l),ss(C,e))},c=e.transition&&"out-in"===e.transition.mode;c&&(n.transition.afterLeave=u),C.isInFallback=!0,p(n,r,null,!0),c||u()},move(e,t,n){C.activeBranch&&d(C.activeBranch,e,t,n),C.container=e},next:()=>C.activeBranch&&h(C.activeBranch),registerDep(e,t,n){const r=!!C.pendingBranch;r&&C.deps++;const o=e.vnode.el;e.asyncDep.catch((t=>{Sn(t,e,0)})).then((i=>{if(e.isUnmounted||C.isUnmounted||C.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:a}=e;Xs(e,i,!1),o&&(a.el=o);const l=!o&&e.subTree.el;t(e,a,v(o||e.subTree.el),o?null:h(e.subTree),C,s,n),l&&g(l),Qi(e,a.el),r&&0==--C.deps&&C.resolve()}))},unmount(e,t){C.isUnmounted=!0,C.activeBranch&&p(C.activeBranch,n,e,t),C.pendingBranch&&p(C.pendingBranch,n,e,t)}};return C}function os(e){let t;if(w(e)){const n=gs&&e._c;n&&(e._d=!1,ps()),e=e(),n&&(e._d=!0,t=ds,hs())}if(g(e)){const t=Ki(e);0,e=t}return e=js(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter((t=>t!==e))),e}function is(e,t){t&&t.pendingBranch?g(e)?t.effects.push(...e):t.effects.push(e):Fn(e)}function ss(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;for(;!o&&t.component;)o=(t=t.component.subTree).el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,Qi(r,o))}const as=Symbol.for("v-fgt"),ls=Symbol.for("v-txt"),us=Symbol.for("v-cmt"),cs=Symbol.for("v-stc"),fs=[];let ds=null;function ps(e=!1){fs.push(ds=e?null:[])}function hs(){fs.pop(),ds=fs[fs.length-1]||null}let vs,gs=1;function ms(e){gs+=e,e<0&&ds&&(ds.hasOnce=!0)}function ys(e){return e.dynamicChildren=gs>0?ds||a:null,hs(),gs>0&&ds&&ds.push(e),e}function bs(e,t,n,r,o,i){return ys(Os(e,t,n,r,o,i,!0))}function ws(e,t,n,r,o){return ys(Es(e,t,n,r,o,!0))}function Cs(e){return!!e&&!0===e.__v_isVNode}function _s(e,t){return e.type===t.type&&e.key===t.key}function xs(e){vs=e}const Ss=({key:e})=>null!=e?e:null,ks=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?C(e)||Kt(e)||w(e)?{i:Wn,r:e,k:t,f:!!n}:e:null);function Os(e,t=null,n=null,r=0,o=null,i=(e===as?0:1),s=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ss(t),ref:t&&ks(t),scopeId:Zn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Wn};return a?(Ms(l,n),128&i&&e.normalize(l)):n&&(l.shapeFlag|=C(n)?8:16),gs>0&&!s&&ds&&(l.patchFlag>0||6&i)&&32!==l.patchFlag&&ds.push(l),l}const Es=Ts;function Ts(e,t=null,n=null,r=0,o=null,i=!1){if(e&&e!==$r||(e=us),Cs(e)){const r=Ls(e,t,!0);return n&&Ms(r,n),gs>0&&!i&&ds&&(6&r.shapeFlag?ds[ds.indexOf(e)]=r:ds.push(r)),r.patchFlag=-2,r}if(ca(e)&&(e=e.__vccOpts),t){t=As(t);let{class:e,style:n}=t;e&&!C(e)&&(t.class=X(e)),x(n)&&(Bt(n)&&!g(n)&&(n=d({},n)),t.style=K(n))}return Os(e,t,n,r,o,C(e)?1:Xi(e)?128:(e=>e.__isTeleport)(e)?64:x(e)?4:w(e)?2:0,i,!0)}function As(e){return e?Bt(e)||Vo(e)?d({},e):e:null}function Ls(e,t,n=!1,r=!1){const{props:o,ref:i,patchFlag:s,children:a,transition:l}=e,u=t?Fs(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Ss(u),ref:t&&t.ref?n&&i?g(i)?i.concat(ks(t)):[i,ks(t)]:ks(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==as?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ls(e.ssContent),ssFallback:e.ssFallback&&Ls(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&dr(c,l.clone(c)),c}function Ps(e=" ",t=0){return Es(ls,null,e,t)}function Rs(e,t){const n=Es(cs,null,e);return n.staticCount=t,n}function Is(e="",t=!1){return t?(ps(),ws(us,null,e)):Es(us,null,e)}function js(e){return null==e||"boolean"==typeof e?Es(us):g(e)?Es(as,null,e.slice()):"object"==typeof e?Ns(e):Es(ls,null,String(e))}function Ns(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:Ls(e)}function Ms(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if(g(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),Ms(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||Vo(t)?3===r&&Wn&&(1===Wn.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=Wn}}else w(t)?(t={default:t,_ctx:Wn},n=32):(t=String(t),64&r?(n=16,t=[Ps(t)]):n=8);e.children=t,e.shapeFlag|=n}function Fs(...e){const t={};for(let n=0;nHs||Wn;let qs,zs;{const e=z(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach((t=>t(e))):r[0](e)}};qs=t("__VUE_INSTANCE_SETTERS__",(e=>Hs=e)),zs=t("__VUE_SSR_SETTERS__",(e=>Js=e))}const Ws=e=>{const t=Hs;return qs(e),e.scope.on(),()=>{e.scope.off(),qs(t)}},Zs=()=>{Hs&&Hs.scope.off(),qs(null)};function Ks(e){return 4&e.vnode.shapeFlag}let Ys,Gs,Js=!1;function Qs(e,t=!1,n=!1){t&&zs(t);const{props:r,children:o}=e.vnode,i=Ks(e);!function(e,t,n,r=!1){const o={},i=Uo();e.propsDefaults=Object.create(null),Ho(e,t,o,i);for(const t in e.propsOptions[0])t in o||(o[t]=void 0);n?e.props=r?o:Rt(o):e.type.props?e.props=o:e.props=i,e.attrs=i}(e,r,i,t),Xo(e,o,n);const s=i?function(e,t){const n=e.type;0;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,no),!1;const{setup:r}=n;if(r){const n=e.setupContext=r.length>1?oa(e):null,o=Ws(e);je();const i=_n(r,e,0,[e.props,n]);if(Ne(),o(),S(i)){if(i.then(Zs,Zs),t)return i.then((n=>{Xs(e,n,t)})).catch((t=>{Sn(t,e,0)}));e.asyncDep=i}else Xs(e,i,t)}else na(e,t)}(e,t):void 0;return t&&zs(!1),s}function Xs(e,t,n){w(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:x(t)&&(e.setupState=rn(t)),na(e,n)}function ea(e){Ys=e,Gs=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,ro))}}const ta=()=>!Ys;function na(e,t,n){const r=e.type;if(!e.render){if(!t&&Ys&&!r.render){const t=r.template||So(e).template;if(t){0;const{isCustomElement:n,compilerOptions:o}=e.appContext.config,{delimiters:i,compilerOptions:s}=r,a=d(d({isCustomElement:n,delimiters:i},o),s);r.render=Ys(t,a)}}e.render=r.render||l,Gs&&Gs(e)}{const t=Ws(e);je();try{Co(e)}finally{Ne(),t()}}}const ra={get:(e,t)=>(ze(e,0,""),e[t])};function oa(e){const t=t=>{e.exposed=t||{}};return{attrs:new Proxy(e.attrs,ra),slots:e.slots,emit:e.emit,expose:t}}function ia(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(rn(Vt(e.exposed)),{get:(t,n)=>n in t?t[n]:n in eo?eo[n](e):void 0,has:(e,t)=>t in e||t in eo})):e.proxy}const sa=/(?:^|[-_])(\w)/g,aa=e=>e.replace(sa,(e=>e.toUpperCase())).replace(/[-_]/g,"");function la(e,t=!0){return w(e)?e.displayName||e.name:e.name||t&&e.__name}function ua(e,t,n=!1){let r=la(t);if(!r&&t.__file){const e=t.__file.match(/([^/\\]+)\.\w+$/);e&&(r=e[1])}if(!r&&e&&e.parent){const n=e=>{for(const n in e)if(e[n]===t)return n};r=n(e.components||e.parent.type.components)||n(e.appContext.components)}return r?aa(r):n?"App":"Anonymous"}function ca(e){return w(e)&&"__vccOpts"in e}const fa=(e,t)=>zt(e,0,Js);function da(e,t,n){const r=arguments.length;return 2===r?x(t)&&!g(t)?Cs(t)?Es(e,null,[t]):Es(e,t):Es(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&Cs(n)&&(n=[n]),Es(e,t,n))}function pa(){return void 0}function ha(e,t,n,r){const o=n[r];if(o&&va(o,e))return o;const i=t();return i.memo=e.slice(),i.cacheIndex=r,n[r]=i}function va(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e0&&ds&&ds.push(e),!0}const ga="3.4.38",ma=l,ya=Cn,ba=$n,wa=function e(t,n){var r,o;if($n=t,$n)$n.enabled=!0,qn.forEach((({event:e,args:t})=>$n.emit(e,...t))),qn=[];else if("undefined"!=typeof window&&window.HTMLElement&&!(null==(o=null==(r=window.navigator)?void 0:r.userAgent)?void 0:o.includes("jsdom"))){(n.__VUE_DEVTOOLS_HOOK_REPLAY__=n.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push((t=>{e(t,n)})),setTimeout((()=>{$n||(n.__VUE_DEVTOOLS_HOOK_REPLAY__=null,zn=!0,qn=[])}),3e3)}else zn=!0,qn=[]},Ca={createComponentInstance:Vs,setupComponent:Qs,renderComponentRoot:Zi,setCurrentRenderingInstance:Kn,isVNode:Cs,normalizeVNode:js,getComponentPublicInstance:ia,ensureValidVNode:Jr},_a=null,xa=null,Sa=null,ka="undefined"!=typeof document?document:null,Oa=ka&&ka.createElement("template"),Ea={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o="svg"===t?ka.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?ka.createElementNS("http://www.w3.org/1998/Math/MathML",e):n?ka.createElement(e,{is:n}):ka.createElement(e);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>ka.createTextNode(e),createComment:e=>ka.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ka.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==i&&(o=o.nextSibling););else{Oa.innerHTML="svg"===r?`${e}`:"mathml"===r?`${e}`:e;const o=Oa.content;if("svg"===r||"mathml"===r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ta="transition",Aa="animation",La=Symbol("_vtc"),Pa=(e,{slots:t})=>da(ar,Ma(e),t);Pa.displayName="Transition";const Ra={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Ia=Pa.props=d({},ir,Ra),ja=(e,t=[])=>{g(e)?e.forEach((e=>e(...t))):e&&e(...t)},Na=e=>!!e&&(g(e)?e.some((e=>e.length>1)):e.length>1);function Ma(e){const t={};for(const n in e)n in Ra||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=i,appearActiveClass:u=s,appearToClass:c=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,v=function(e){if(null==e)return null;if(x(e))return[Fa(e.enter),Fa(e.leave)];{const t=Fa(e);return[t,t]}}(o),g=v&&v[0],m=v&&v[1],{onBeforeEnter:y,onEnter:b,onEnterCancelled:w,onLeave:C,onLeaveCancelled:_,onBeforeAppear:S=y,onAppear:k=b,onAppearCancelled:O=w}=t,E=(e,t,n)=>{Ba(e,t?c:a),Ba(e,t?u:s),n&&n()},T=(e,t)=>{e._isLeaving=!1,Ba(e,f),Ba(e,h),Ba(e,p),t&&t()},A=e=>(t,n)=>{const o=e?k:b,s=()=>E(t,e,n);ja(o,[t,s]),Ua((()=>{Ba(t,e?l:i),Da(t,e?c:a),Na(o)||Ha(t,r,g,s)}))};return d(t,{onBeforeEnter(e){ja(y,[e]),Da(e,i),Da(e,s)},onBeforeAppear(e){ja(S,[e]),Da(e,l),Da(e,u)},onEnter:A(!1),onAppear:A(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>T(e,t);Da(e,f),Da(e,p),Wa(),Ua((()=>{e._isLeaving&&(Ba(e,f),Da(e,h),Na(C)||Ha(e,r,m,n))})),ja(C,[e,n])},onEnterCancelled(e){E(e,!1),ja(w,[e])},onAppearCancelled(e){E(e,!0),ja(O,[e])},onLeaveCancelled(e){T(e),ja(_,[e])}})}function Fa(e){return $(e)}function Da(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e[La]||(e[La]=new Set)).add(t)}function Ba(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const n=e[La];n&&(n.delete(t),n.size||(e[La]=void 0))}function Ua(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let Va=0;function Ha(e,t,n,r){const o=e._endId=++Va,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:s,timeout:a,propCount:l}=$a(e,t);if(!s)return r();const u=s+"end";let c=0;const f=()=>{e.removeEventListener(u,d),i()},d=t=>{t.target===e&&++c>=l&&f()};setTimeout((()=>{c(n[e]||"").split(", "),o=r(`${Ta}Delay`),i=r(`${Ta}Duration`),s=qa(o,i),a=r(`${Aa}Delay`),l=r(`${Aa}Duration`),u=qa(a,l);let c=null,f=0,d=0;t===Ta?s>0&&(c=Ta,f=s,d=i.length):t===Aa?u>0&&(c=Aa,f=u,d=l.length):(f=Math.max(s,u),c=f>0?s>u?Ta:Aa:null,d=c?c===Ta?i.length:l.length:0);return{type:c,timeout:f,propCount:d,hasTransform:c===Ta&&/\b(transform|all)(,|$)/.test(r(`${Ta}Property`).toString())}}function qa(e,t){for(;e.lengthza(t)+za(e[n]))))}function za(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function Wa(){return document.body.offsetHeight}const Za=Symbol("_vod"),Ka=Symbol("_vsh"),Ya={beforeMount(e,{value:t},{transition:n}){e[Za]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):Ga(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Ga(e,!0),r.enter(e)):r.leave(e,(()=>{Ga(e,!1)})):Ga(e,t))},beforeUnmount(e,{value:t}){Ga(e,t)}};function Ga(e,t){e.style.display=t?e[Za]:"none",e[Ka]=!t}const Ja=Symbol("");function Qa(e){const t=$s();if(!t)return;const n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach((e=>el(e,n)))};const r=()=>{const r=e(t.proxy);Xa(t.subTree,r),n(r)};Lr((()=>{ji(r)})),Pr((()=>{const e=new MutationObserver(r);e.observe(t.subTree.el.parentNode,{childList:!0}),Nr((()=>e.disconnect()))}))}function Xa(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{Xa(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el)el(e.el,t);else if(e.type===as)e.children.forEach((e=>Xa(e,t)));else if(e.type===cs){let{el:n,anchor:r}=e;for(;n&&(el(n,t),n!==r);)n=n.nextSibling}}function el(e,t){if(1===e.nodeType){const n=e.style;let r="";for(const e in t)n.setProperty(`--${e}`,t[e]),r+=`--${e}: ${t[e]};`;n[Ja]=r}}const tl=/(^|;)\s*display\s*:/;const nl=/\s*!important$/;function rl(e,t,n){if(g(n))n.forEach((n=>rl(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=il[t];if(n)return n;let r=j(t);if("filter"!==r&&r in e)return il[t]=r;r=F(r);for(let n=0;n{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();xn(function(e,t){if(g(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=hl(),n}(r,o);ll(e,n,s,a)}else s&&(!function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,s,a),i[t]=void 0)}}const fl=/(?:Once|Passive|Capture)$/;let dl=0;const pl=Promise.resolve(),hl=()=>dl||(pl.then((()=>dl=0)),dl=Date.now());const vl=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123;function gl(e,t,n){const r=hr(e,t);class o extends bl{constructor(e){super(r,e,n)}}return o.def=r,o}const ml=(e,t)=>gl(e,t,nu),yl="undefined"!=typeof HTMLElement?HTMLElement:class{};class bl extends yl{constructor(e,t={},n){super(),this._def=e,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this._ob=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,jn((()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),tu(null,this.shadowRoot),this._instance=null)}))}_resolveDef(){this._resolved=!0;for(let e=0;e{for(const t of e)this._setAttr(t.attributeName)})),this._ob.observe(this,{attributes:!0});const e=(e,t=!1)=>{const{props:n,styles:r}=e;let o;if(n&&!g(n))for(const e in n){const t=n[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=$(this._props[e])),(o||(o=Object.create(null)))[j(e)]=!0)}this._numberProps=o,t&&this._resolveProps(e),this._applyStyles(r),this._update()},t=this._def.__asyncLoader;t?t().then((t=>e(t,!0))):e(this._def)}_resolveProps(e){const{props:t}=e,n=g(t)?t:Object.keys(t||{});for(const e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e],!0,!1);for(const e of n.map(j))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t)}})}_setAttr(e){let t=this.hasAttribute(e)?this.getAttribute(e):void 0;const n=j(e);this._numberProps&&this._numberProps[n]&&(t=$(t)),this._setProp(n,t,!1)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!0){t!==this._props[e]&&(this._props[e]=t,r&&this._instance&&this._update(),n&&(!0===t?this.setAttribute(M(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(M(e),t+""):t||this.removeAttribute(M(e))))}_update(){tu(this._createVNode(),this.shadowRoot)}_createVNode(){const e=Es(this._def,d({},this._props));return this._instance||(e.ce=e=>{this._instance=e,e.isCE=!0;const t=(e,t)=>{this.dispatchEvent(new CustomEvent(e,{detail:t}))};e.emit=(e,...n)=>{t(e,n),M(e)!==e&&t(M(e),n)};let n=this;for(;n=n&&(n.parentNode||n.host);)if(n instanceof bl){e.parent=n._instance,e.provides=n._instance.provides;break}}),e}_applyStyles(e){e&&e.forEach((e=>{const t=document.createElement("style");t.textContent=e,this.shadowRoot.appendChild(t)}))}}function wl(e="$style"){{const t=$s();if(!t)return s;const n=t.type.__cssModules;if(!n)return s;const r=n[e];return r||s}}const Cl=new WeakMap,_l=new WeakMap,xl=Symbol("_moveCb"),Sl=Symbol("_enterCb"),kl={name:"TransitionGroup",props:d({},Ia,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=$s(),r=rr();let o,i;return Ir((()=>{if(!o.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const r=e.cloneNode(),o=e[La];o&&o.forEach((e=>{e.split(/\s+/).forEach((e=>e&&r.classList.remove(e)))}));n.split(/\s+/).forEach((e=>e&&r.classList.add(e))),r.style.display="none";const i=1===t.nodeType?t:t.parentNode;i.appendChild(r);const{hasTransform:s}=$a(r);return i.removeChild(r),s}(o[0].el,n.vnode.el,t))return;o.forEach(El),o.forEach(Tl);const r=o.filter(Al);Wa(),r.forEach((e=>{const n=e.el,r=n.style;Da(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n[xl]=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n[xl]=null,Ba(n,t))};n.addEventListener("transitionend",o)}))})),()=>{const s=Ut(e),a=Ma(s);let l=s.tag||as;if(o=[],i)for(let e=0;e{const t=e.props["onUpdate:modelValue"]||!1;return g(t)?e=>U(t,e):t};function Pl(e){e.target.composing=!0}function Rl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Il=Symbol("_assign"),jl={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Il]=Ll(o);const i=r||o.props&&"number"===o.props.type;ll(e,t?"change":"input",(t=>{if(t.target.composing)return;let r=e.value;n&&(r=r.trim()),i&&(r=H(r)),e[Il](r)})),n&&ll(e,"change",(()=>{e.value=e.value.trim()})),t||(ll(e,"compositionstart",Pl),ll(e,"compositionend",Rl),ll(e,"change",Rl))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:i}},s){if(e[Il]=Ll(s),e.composing)return;const a=null==t?"":t;if((!i&&"number"!==e.type||/^0\d/.test(e.value)?e.value:H(e.value))!==a){if(document.activeElement===e&&"range"!==e.type){if(r&&t===n)return;if(o&&e.value.trim()===a)return}e.value=a}}},Nl={deep:!0,created(e,t,n){e[Il]=Ll(n),ll(e,"change",(()=>{const t=e._modelValue,n=Ul(e),r=e.checked,o=e[Il];if(g(t)){const e=de(t,n),i=-1!==e;if(r&&!i)o(t.concat(n));else if(!r&&i){const n=[...t];n.splice(e,1),o(n)}}else if(y(t)){const e=new Set(t);r?e.add(n):e.delete(n),o(e)}else o(Vl(e,r))}))},mounted:Ml,beforeUpdate(e,t,n){e[Il]=Ll(n),Ml(e,t,n)}};function Ml(e,{value:t,oldValue:n},r){e._modelValue=t,g(t)?e.checked=de(t,r.props.value)>-1:y(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=fe(t,Vl(e,!0)))}const Fl={created(e,{value:t},n){e.checked=fe(t,n.props.value),e[Il]=Ll(n),ll(e,"change",(()=>{e[Il](Ul(e))}))},beforeUpdate(e,{value:t,oldValue:n},r){e[Il]=Ll(r),t!==n&&(e.checked=fe(t,r.props.value))}},Dl={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=y(t);ll(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?H(Ul(e)):Ul(e)));e[Il](e.multiple?o?new Set(t):t:t[0]),e._assigning=!0,jn((()=>{e._assigning=!1}))})),e[Il]=Ll(r)},mounted(e,{value:t,modifiers:{number:n}}){Bl(e,t)},beforeUpdate(e,t,n){e[Il]=Ll(n)},updated(e,{value:t,modifiers:{number:n}}){e._assigning||Bl(e,t)}};function Bl(e,t,n){const r=e.multiple,o=g(t);if(!r||o||y(t)){for(let n=0,i=e.options.length;nString(e)===String(s))):de(t,s)>-1}else i.selected=t.has(s);else if(fe(Ul(i),t))return void(e.selectedIndex!==n&&(e.selectedIndex=n))}r||-1===e.selectedIndex||(e.selectedIndex=-1)}}function Ul(e){return"_value"in e?e._value:e.value}function Vl(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Hl={created(e,t,n){ql(e,t,n,null,"created")},mounted(e,t,n){ql(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){ql(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){ql(e,t,n,r,"updated")}};function $l(e,t){switch(e){case"SELECT":return Dl;case"TEXTAREA":return jl;default:switch(t){case"checkbox":return Nl;case"radio":return Fl;default:return jl}}}function ql(e,t,n,r,o){const i=$l(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}const zl=["ctrl","shift","alt","meta"],Wl={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>zl.some((n=>e[`${n}Key`]&&!t.includes(n)))},Zl=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(n,...r)=>{for(let e=0;e{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=n=>{if(!("key"in n))return;const r=M(n.key);return t.some((e=>e===r||Kl[e]===r))?e(n):void 0})},Gl=d({patchProp:(e,t,n,r,o,i)=>{const s="svg"===o;"class"===t?function(e,t,n){const r=e[La];r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,s):"style"===t?function(e,t,n){const r=e.style,o=C(n);let i=!1;if(n&&!o){if(t)if(C(t))for(const e of t.split(";")){const t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&rl(r,t,"")}else for(const e in t)null==n[e]&&rl(r,e,"");for(const e in n)"display"===e&&(i=!0),rl(r,e,n[e])}else if(o){if(t!==n){const e=r[Ja];e&&(n+=";"+e),r.cssText=n,i=tl.test(n)}}else t&&e.removeAttribute("style");Za in e&&(e[Za]=i?r.display:"",e[Ka]&&(r.display="none"))}(e,n,r):c(t)?f(t)||cl(e,t,0,r,i):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){if(r)return"innerHTML"===t||"textContent"===t||!!(t in e&&vl(t)&&w(n));if("spellcheck"===t||"draggable"===t||"translate"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){const t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}if(vl(t)&&C(n))return!1;return t in e}(e,t,r,s))?(!function(e,t,n){if("innerHTML"===t||"textContent"===t){if(null==n)return;return void(e[t]=n)}const r=e.tagName;if("value"===t&&"PROGRESS"!==r&&!r.includes("-")){const o="OPTION"===r?e.getAttribute("value")||"":e.value,i=null==n?"":String(n);return o===i&&"_value"in e||(e.value=i),null==n&&e.removeAttribute(t),void(e._value=n)}let o=!1;if(""===n||null==n){const r=typeof e[t];"boolean"===r?n=le(n):null==n&&"string"===r?(n="",o=!0):"number"===r&&(n=0,o=!0)}try{e[t]=n}catch(e){}o&&e.removeAttribute(t)}(e,t,r),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||al(e,t,r,s,0,"value"!==t)):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),al(e,t,r,s))}},Ea);let Jl,Ql=!1;function Xl(){return Jl||(Jl=_i(Gl))}function eu(){return Jl=Ql?Jl:xi(Gl),Ql=!0,Jl}const tu=(...e)=>{Xl().render(...e)},nu=(...e)=>{eu().hydrate(...e)},ru=(...e)=>{const t=Xl().createApp(...e);const{mount:n}=t;return t.mount=e=>{const r=su(e);if(!r)return;const o=t._component;w(o)||o.render||o.template||(o.template=r.innerHTML),r.innerHTML="";const i=n(r,!1,iu(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},t},ou=(...e)=>{const t=eu().createApp(...e);const{mount:n}=t;return t.mount=e=>{const t=su(e);if(t)return n(t,!0,iu(t))},t};function iu(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}function su(e){if(C(e)){return document.querySelector(e)}return e}let au=!1;const lu=()=>{au||(au=!0,jl.getSSRProps=({value:e})=>({value:e}),Fl.getSSRProps=({value:e},t)=>{if(t.props&&fe(t.props.value,e))return{checked:!0}},Nl.getSSRProps=({value:e},t)=>{if(g(e)){if(t.props&&de(e,t.props.value)>-1)return{checked:!0}}else if(y(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},Hl.getSSRProps=(e,t)=>{if("string"!=typeof t.type)return;const n=$l(t.type.toUpperCase(),t.props&&t.props.type);return n.getSSRProps?n.getSSRProps(e,t):void 0},Ya.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})},uu=Symbol(""),cu=Symbol(""),fu=Symbol(""),du=Symbol(""),pu=Symbol(""),hu=Symbol(""),vu=Symbol(""),gu=Symbol(""),mu=Symbol(""),yu=Symbol(""),bu=Symbol(""),wu=Symbol(""),Cu=Symbol(""),_u=Symbol(""),xu=Symbol(""),Su=Symbol(""),ku=Symbol(""),Ou=Symbol(""),Eu=Symbol(""),Tu=Symbol(""),Au=Symbol(""),Lu=Symbol(""),Pu=Symbol(""),Ru=Symbol(""),Iu=Symbol(""),ju=Symbol(""),Nu=Symbol(""),Mu=Symbol(""),Fu=Symbol(""),Du=Symbol(""),Bu=Symbol(""),Uu=Symbol(""),Vu=Symbol(""),Hu=Symbol(""),$u=Symbol(""),qu=Symbol(""),zu=Symbol(""),Wu=Symbol(""),Zu=Symbol(""),Ku={[uu]:"Fragment",[cu]:"Teleport",[fu]:"Suspense",[du]:"KeepAlive",[pu]:"BaseTransition",[hu]:"openBlock",[vu]:"createBlock",[gu]:"createElementBlock",[mu]:"createVNode",[yu]:"createElementVNode",[bu]:"createCommentVNode",[wu]:"createTextVNode",[Cu]:"createStaticVNode",[_u]:"resolveComponent",[xu]:"resolveDynamicComponent",[Su]:"resolveDirective",[ku]:"resolveFilter",[Ou]:"withDirectives",[Eu]:"renderList",[Tu]:"renderSlot",[Au]:"createSlots",[Lu]:"toDisplayString",[Pu]:"mergeProps",[Ru]:"normalizeClass",[Iu]:"normalizeStyle",[ju]:"normalizeProps",[Nu]:"guardReactiveProps",[Mu]:"toHandlers",[Fu]:"camelize",[Du]:"capitalize",[Bu]:"toHandlerKey",[Uu]:"setBlockTracking",[Vu]:"pushScopeId",[Hu]:"popScopeId",[$u]:"withCtx",[qu]:"unref",[zu]:"isRef",[Wu]:"withMemo",[Zu]:"isMemoSame"};const Yu={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function Gu(e,t,n,r,o,i,s,a=!1,l=!1,u=!1,c=Yu){return e&&(a?(e.helper(hu),e.helper(sc(e.inSSR,u))):e.helper(ic(e.inSSR,u)),s&&e.helper(Ou)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:i,directives:s,isBlock:a,disableTracking:l,isComponent:u,loc:c}}function Ju(e,t=Yu){return{type:17,loc:t,elements:e}}function Qu(e,t=Yu){return{type:15,loc:t,properties:e}}function Xu(e,t){return{type:16,loc:Yu,key:C(e)?ec(e,!0):e,value:t}}function ec(e,t=!1,n=Yu,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function tc(e,t=Yu){return{type:8,loc:t,children:e}}function nc(e,t=[],n=Yu){return{type:14,loc:n,callee:e,arguments:t}}function rc(e,t=void 0,n=!1,r=!1,o=Yu){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function oc(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:Yu}}function ic(e,t){return e||t?mu:yu}function sc(e,t){return e||t?vu:gu}function ac(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(ic(r,e.isComponent)),t(hu),t(sc(r,e.isComponent)))}const lc=new Uint8Array([123,123]),uc=new Uint8Array([125,125]);function cc(e){return e>=97&&e<=122||e>=65&&e<=90}function fc(e){return 32===e||10===e||9===e||12===e||13===e}function dc(e){return 47===e||62===e||fc(e)}function pc(e){const t=new Uint8Array(e.length);for(let n=0;n4===e.type&&e.isStatic;function _c(e){switch(e){case"Teleport":case"teleport":return cu;case"Suspense":case"suspense":return fu;case"KeepAlive":case"keep-alive":return du;case"BaseTransition":case"base-transition":return pu}}const xc=/^\d|[^\$\w\xA0-\uFFFF]/,Sc=e=>!xc.test(e),kc=/[A-Za-z_$\xA0-\uFFFF]/,Oc=/[\.\?\w$\xA0-\uFFFF]/,Ec=/\s+[.[]\s*|\s*[.[]\s+/g,Tc=e=>4===e.type?e.content:e.loc.source,Ac=e=>{const t=Tc(e).trim().replace(Ec,(e=>e.trim()));let n=0,r=[],o=0,i=0,s=null;for(let e=0;e|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,Pc=e=>Lc.test(Tc(e));function Rc(e,t,n=!1){for(let r=0;r4===e.key.type&&e.key.content===r))}return n}function $c(e,t){return`_${t}_${e.replace(/[^\w]/g,((t,n)=>"-"===t?"_":e.charCodeAt(n).toString()))}`}const qc=/([\s\S]*?)\s+(?:in|of)\s+(\S[\s\S]*)/,zc={parseMode:"base",ns:0,delimiters:["{{","}}"],getNamespace:()=>0,isVoidTag:u,isPreTag:u,isCustomElement:u,onError:yc,onWarn:bc,comments:!1,prefixIdentifiers:!1};let Wc=zc,Zc=null,Kc="",Yc=null,Gc=null,Jc="",Qc=-1,Xc=-1,ef=0,tf=!1,nf=null;const rf=[],of=new class{constructor(e,t){this.stack=e,this.cbs=t,this.state=1,this.buffer="",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=lc,this.delimiterClose=uc,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return 2===this.mode&&0===this.stack.length}reset(){this.state=1,this.mode=0,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=lc,this.delimiterClose=uc}getPos(e){let t=1,n=e+1;for(let r=this.newlines.length-1;r>=0;r--){const o=this.newlines[r];if(e>o){t=r+2,n=e-o;break}}return{column:n,line:t,offset:e}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(e){60===e?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):this.inVPre||e!==this.delimiterOpen[0]||(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(e))}stateInterpolationOpen(e){if(e===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){const e=this.index+1-this.delimiterOpen.length;e>this.sectionStart&&this.cbs.ontext(this.sectionStart,e),this.state=3,this.sectionStart=e}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(e)):(this.state=1,this.stateText(e))}stateInterpolation(e){e===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(e))}stateInterpolationClose(e){e===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(e))}stateSpecialStartSequence(e){const t=this.sequenceIndex===this.currentSequence.length;if(t?dc(e):(32|e)===this.currentSequence[this.sequenceIndex]){if(!t)return void this.sequenceIndex++}else this.inRCDATA=!1;this.sequenceIndex=0,this.state=6,this.stateInTagName(e)}stateInRCDATA(e){if(this.sequenceIndex===this.currentSequence.length){if(62===e||fc(e)){const t=this.index-this.currentSequence.length;if(this.sectionStart=e||(28===this.state?this.currentSequence===hc.CdataEnd?this.cbs.oncdata(this.sectionStart,e):this.cbs.oncomment(this.sectionStart,e):6===this.state||11===this.state||18===this.state||17===this.state||12===this.state||13===this.state||14===this.state||15===this.state||16===this.state||20===this.state||19===this.state||21===this.state||9===this.state||this.cbs.ontext(this.sectionStart,e))}emitCodePoint(e,t){}}(rf,{onerr:kf,ontext(e,t){cf(lf(e,t),e,t)},ontextentity(e,t,n){cf(e,t,n)},oninterpolation(e,t){if(tf)return cf(lf(e,t),e,t);let n=e+of.delimiterOpen.length,r=t-of.delimiterClose.length;for(;fc(Kc.charCodeAt(n));)n++;for(;fc(Kc.charCodeAt(r-1));)r--;let o=lf(n,r);o.includes("&")&&(o=Wc.decodeEntities(o,!1)),wf({type:5,content:Sf(o,!1,Cf(n,r)),loc:Cf(e,t)})},onopentagname(e,t){const n=lf(e,t);Yc={type:1,tag:n,ns:Wc.getNamespace(n,rf[0],Wc.ns),tagType:0,props:[],children:[],loc:Cf(e-1,t),codegenNode:void 0}},onopentagend(e){uf(e)},onclosetag(e,t){const n=lf(e,t);if(!Wc.isVoidTag(n)){let r=!1;for(let e=0;e0&&kf(24,rf[0].loc.start.offset);for(let n=0;n<=e;n++){ff(rf.shift(),t,n(7===e.type?e.rawName:e.name)===n))&&kf(2,t)},onattribend(e,t){if(Yc&&Gc){if(_f(Gc.loc,t),0!==e)if(Jc.includes("&")&&(Jc=Wc.decodeEntities(Jc,!0)),6===Gc.type)"class"===Gc.name&&(Jc=bf(Jc).trim()),1!==e||Jc||kf(13,t),Gc.value={type:2,content:Jc,loc:1===e?Cf(Qc,Xc):Cf(Qc-1,Xc+1)},of.inSFCRoot&&"template"===Yc.tag&&"lang"===Gc.name&&Jc&&"html"!==Jc&&of.enterRCDATA(pc("{const o=t.start.offset+n;return Sf(e,!1,Cf(o,o+e.length),0,r?1:0)},a={source:s(i.trim(),n.indexOf(i,o.length)),value:void 0,key:void 0,index:void 0,finalized:!1};let l=o.trim().replace(af,"").trim();const u=o.indexOf(l),c=l.match(sf);if(c){l=l.replace(sf,"").trim();const e=c[1].trim();let t;if(e&&(t=n.indexOf(e,u+l.length),a.key=s(e,t,!0)),c[2]){const r=c[2].trim();r&&(a.index=s(r,n.indexOf(r,a.key?t+e.length:u+l.length),!0))}}l&&(a.value=s(l,u,!0));return a}(Gc.exp));let t=-1;"bind"===Gc.name&&(t=Gc.modifiers.indexOf("sync"))>-1&&mc("COMPILER_V_BIND_SYNC",Wc,Gc.loc,Gc.rawName)&&(Gc.name="model",Gc.modifiers.splice(t,1))}7===Gc.type&&"pre"===Gc.name||Yc.props.push(Gc)}Jc="",Qc=Xc=-1},oncomment(e,t){Wc.comments&&wf({type:3,content:lf(e,t),loc:Cf(e-4,t+3)})},onend(){const e=Kc.length;for(let t=0;t64&&e<91}(e.charCodeAt(0))||_c(e)||Wc.isBuiltInComponent&&Wc.isBuiltInComponent(e)||Wc.isNativeTag&&!Wc.isNativeTag(e))return!0;for(let e=0;e6===e.type&&"inline-template"===e.name));n&&mc("COMPILER_INLINE_TEMPLATE",Wc,n.loc)&&e.children.length&&(n.value={type:2,content:lf(e.children[0].loc.start.offset,e.children[e.children.length-1].loc.end.offset),loc:n.loc})}}function df(e,t){let n=e;for(;Kc.charCodeAt(n)!==t&&n>=0;)n--;return n}const pf=new Set(["if","else","else-if","for","slot"]);function hf({tag:e,props:t}){if("template"===e)for(let e=0;e0){if(e>=2){o.codegenNode.patchFlag=-1,o.codegenNode=t.hoist(o.codegenNode),i++;continue}}else{const e=o.codegenNode;if(13===e.type){const n=e.patchFlag;if((void 0===n||512===n||1===n)&&If(o,t)>=2){const n=jf(o);n&&(e.props=t.hoist(n))}e.dynamicProps&&(e.dynamicProps=t.hoist(e.dynamicProps))}}}if(1===o.type){const e=1===o.tagType;e&&t.scopes.vSlot++,Af(o,t),e&&t.scopes.vSlot--}else if(11===o.type)Af(o,t,1===o.children.length);else if(9===o.type)for(let e=0;e1)for(let o=0;o`_${Ku[E.helper(e)]}`,replaceNode(e){E.parent.children[E.childIndex]=E.currentNode=e},removeNode(e){const t=E.parent.children,n=e?t.indexOf(e):E.currentNode?E.childIndex:-1;e&&e!==E.currentNode?E.childIndex>n&&(E.childIndex--,E.onNodeRemoved()):(E.currentNode=null,E.onNodeRemoved()),E.parent.children.splice(n,1)},onNodeRemoved:l,addIdentifiers(e){},removeIdentifiers(e){},hoist(e){C(e)&&(e=ec(e)),E.hoists.push(e);const t=ec(`_hoisted_${E.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVOnce:n,loc:Yu}}(E.cached++,e,t)};return E.filters=new Set,E}function Mf(e,t){const n=Nf(e,t);Ff(e,n),t.hoistStatic&&Ef(e,n),t.ssr||function(e,t){const{helper:n}=t,{children:r}=e;if(1===r.length){const n=r[0];if(Tf(e,n)&&n.codegenNode){const r=n.codegenNode;13===r.type&&ac(r,t),e.codegenNode=r}else e.codegenNode=n}else if(r.length>1){let r=64;W[64];0,e.codegenNode=Gu(t,n(uu),void 0,e.children,r,void 0,void 0,!0,void 0,!1)}}(e,n),e.helpers=new Set([...n.helpers.keys()]),e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.transformed=!0,e.filters=[...n.filters]}function Ff(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let o=0;o{n--};for(;nt===e:t=>e.test(t);return(e,r)=>{if(1===e.type){const{props:o}=e;if(3===e.tagType&&o.some(Mc))return;const i=[];for(let s=0;s`${Ku[e]}: _${Ku[e]}`;function Vf(e,t={}){const n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:i=null,optimizeImports:s=!1,runtimeGlobalName:a="Vue",runtimeModuleName:l="vue",ssrRuntimeModuleName:u="vue/server-renderer",ssr:c=!1,isTS:f=!1,inSSR:d=!1}){const p={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:i,optimizeImports:s,runtimeGlobalName:a,runtimeModuleName:l,ssrRuntimeModuleName:u,ssr:c,isTS:f,inSSR:d,source:e.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${Ku[e]}`,push(e,t=-2,n){p.code+=e},indent(){h(++p.indentLevel)},deindent(e=!1){e?--p.indentLevel:h(--p.indentLevel)},newline(){h(p.indentLevel)}};function h(e){p.push("\n"+" ".repeat(e),0)}return p}(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:o,prefixIdentifiers:i,indent:s,deindent:a,newline:l,scopeId:u,ssr:c}=n,f=Array.from(e.helpers),d=f.length>0,p=!i&&"module"!==r;!function(e,t){const{ssr:n,prefixIdentifiers:r,push:o,newline:i,runtimeModuleName:s,runtimeGlobalName:a,ssrRuntimeModuleName:l}=t,u=a,c=Array.from(e.helpers);if(c.length>0&&(o(`const _Vue = ${u}\n`,-1),e.hoists.length)){o(`const { ${[mu,yu,bu,wu,Cu].filter((e=>c.includes(e))).map(Uf).join(", ")} } = _Vue\n`,-1)}(function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r,helper:o,scopeId:i,mode:s}=t;r();for(let o=0;o0)&&l()),e.directives.length&&(Hf(e.directives,"directive",n),e.temps>0&&l()),e.filters&&e.filters.length&&(l(),Hf(e.filters,"filter",n),l()),e.temps>0){o("let ");for(let t=0;t0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(o("\n",0),l()),c||o("return "),e.codegenNode?zf(e.codegenNode,n):o("null"),p&&(a(),o("}")),a(),o("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function Hf(e,t,{helper:n,push:r,newline:o,isTS:i}){const s=n("filter"===t?ku:"component"===t?_u:Su);for(let n=0;n3||!1;t.push("["),n&&t.indent(),qf(e,t,n),n&&t.deindent(),t.push("]")}function qf(e,t,n=!1,r=!0){const{push:o,newline:i}=t;for(let s=0;se||"null"))}([i,s,a,h,u]),t),n(")"),f&&n(")");c&&(n(", "),zf(c,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:r,pure:o}=t,i=C(e.callee)?e.callee:r(e.callee);o&&n(Bf);n(i+"(",-2,e),qf(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:r,deindent:o,newline:i}=t,{properties:s}=e;if(!s.length)return void n("{}",-2,e);const a=s.length>1||!1;n(a?"{":"{ "),a&&r();for(let e=0;e "),(l||a)&&(n("{"),r());s?(l&&n("return "),g(s)?$f(s,t):zf(s,t)):a&&zf(a,t);(l||a)&&(o(),n("}"));u&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}(e,t);break;case 19:!function(e,t){const{test:n,consequent:r,alternate:o,newline:i}=e,{push:s,indent:a,deindent:l,newline:u}=t;if(4===n.type){const e=!Sc(n.content);e&&s("("),Wf(n,t),e&&s(")")}else s("("),zf(n,t),s(")");i&&a(),t.indentLevel++,i||s(" "),s("? "),zf(r,t),t.indentLevel--,i&&u(),i||s(" "),s(": ");const c=19===o.type;c||t.indentLevel++;zf(o,t),c||t.indentLevel--;i&&l(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:r,indent:o,deindent:i,newline:s}=t;n(`_cache[${e.index}] || (`),e.isVOnce&&(o(),n(`${r(Uu)}(-1),`),s(),n("("));n(`_cache[${e.index}] = `),zf(e.value,t),e.isVOnce&&(n(`).cacheIndex = ${e.index},`),s(),n(`${r(Uu)}(1),`),s(),n(`_cache[${e.index}]`),i());n(")")}(e,t);break;case 21:qf(e.body,t,!0,!1)}}function Wf(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,-3,e)}function Zf(e,t){for(let n=0;nfunction(e,t,n,r){if(!("else"===t.name||t.exp&&t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(wc(28,t.loc)),t.exp=ec("true",!1,r)}0;if("if"===t.name){const o=Gf(e,t),i={type:9,loc:e.loc,branches:[o]};if(n.replaceNode(i),r)return r(i,o,!0)}else{const o=n.parent.children;let i=o.indexOf(e);for(;i-- >=-1;){const s=o[i];if(s&&3===s.type)n.removeNode(s);else{if(!s||2!==s.type||s.content.trim().length){if(s&&9===s.type){"else-if"===t.name&&void 0===s.branches[s.branches.length-1].condition&&n.onError(wc(30,e.loc)),n.removeNode();const o=Gf(e,t);0,s.branches.push(o);const i=r&&r(s,o,!1);Ff(o,n),i&&i(),n.currentNode=null}else n.onError(wc(30,e.loc));break}n.removeNode(s)}}}}(e,t,n,((e,t,r)=>{const o=n.parent.children;let i=o.indexOf(e),s=0;for(;i-- >=0;){const e=o[i];e&&9===e.type&&(s+=e.branches.length)}return()=>{if(r)e.codegenNode=Jf(t,s,n);else{const r=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode);r.alternate=Jf(t,s+e.branches.length-1,n)}}}))));function Gf(e,t){const n=3===e.tagType;return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:n&&!Rc(e,"for")?e.children:[e],userKey:Ic(e,"key"),isTemplateIf:n}}function Jf(e,t,n){return e.condition?oc(e.condition,Qf(e,t,n),nc(n.helper(bu),['""',"true"])):Qf(e,t,n)}function Qf(e,t,n){const{helper:r}=n,o=Xu("key",ec(`${t}`,!1,Yu,2)),{children:i}=e,s=i[0];if(1!==i.length||1!==s.type){if(1===i.length&&11===s.type){const e=s.codegenNode;return Vc(e,o,n),e}{let t=64;W[64];return Gu(n,r(uu),Qu([o]),i,t,void 0,void 0,!0,!1,!1,e.loc)}}{const e=s.codegenNode,t=14===(a=e).type&&a.callee===Wu?a.arguments[1].returns:a;return 13===t.type&&ac(t,n),Vc(t,o,n),e}var a}const Xf=(e,t,n)=>{const{modifiers:r,loc:o}=e,i=e.arg;let{exp:s}=e;if(s&&4===s.type&&!s.content.trim()&&(s=void 0),!s){if(4!==i.type||!i.isStatic)return n.onError(wc(52,i.loc)),{props:[Xu(i,ec("",!0,o))]};ed(e),s=e.exp}return 4!==i.type?(i.children.unshift("("),i.children.push(') || ""')):i.isStatic||(i.content=`${i.content} || ""`),r.includes("camel")&&(4===i.type?i.isStatic?i.content=j(i.content):i.content=`${n.helperString(Fu)}(${i.content})`:(i.children.unshift(`${n.helperString(Fu)}(`),i.children.push(")"))),n.inSSR||(r.includes("prop")&&td(i,"."),r.includes("attr")&&td(i,"^")),{props:[Xu(i,s)]}},ed=(e,t)=>{const n=e.arg,r=j(n.content);e.exp=ec(r,!1,n.loc)},td=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},nd=Df("for",((e,t,n)=>{const{helper:r,removeHelper:o}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(wc(31,t.loc));const o=t.forParseResult;if(!o)return void n.onError(wc(32,t.loc));rd(o,n);const{addIdentifiers:i,removeIdentifiers:s,scopes:a}=n,{source:l,value:u,key:c,index:f}=o,d={type:11,loc:t.loc,source:l,valueAlias:u,keyAlias:c,objectIndexAlias:f,parseResult:o,children:Fc(e)?e.children:[e]};n.replaceNode(d),a.vFor++;const p=r&&r(d);return()=>{a.vFor--,p&&p()}}(e,t,n,(t=>{const i=nc(r(Eu),[t.source]),s=Fc(e),a=Rc(e,"memo"),l=Ic(e,"key",!1,!0);l&&7===l.type&&!l.exp&&ed(l);const u=l&&(6===l.type?l.value?ec(l.value.content,!0):void 0:l.exp),c=l&&u?Xu("key",u):null,f=4===t.source.type&&t.source.constType>0,d=f?64:l?128:256;return t.codegenNode=Gu(n,r(uu),void 0,i,d,void 0,void 0,!0,!f,!1,e.loc),()=>{let l;const{children:d}=t;const p=1!==d.length||1!==d[0].type,h=Dc(e)?e:s&&1===e.children.length&&Dc(e.children[0])?e.children[0]:null;if(h?(l=h.codegenNode,s&&c&&Vc(l,c,n)):p?l=Gu(n,r(uu),c?Qu([c]):void 0,e.children,64,void 0,void 0,!0,void 0,!1):(l=d[0].codegenNode,s&&c&&Vc(l,c,n),l.isBlock!==!f&&(l.isBlock?(o(hu),o(sc(n.inSSR,l.isComponent))):o(ic(n.inSSR,l.isComponent))),l.isBlock=!f,l.isBlock?(r(hu),r(sc(n.inSSR,l.isComponent))):r(ic(n.inSSR,l.isComponent))),a){const e=rc(od(t.parseResult,[ec("_cached")]));e.body={type:21,body:[tc(["const _memo = (",a.exp,")"]),tc(["if (_cached",...u?[" && _cached.key === ",u]:[],` && ${n.helperString(Zu)}(_cached, _memo)) return _cached`]),tc(["const _item = ",l]),ec("_item.memo = _memo"),ec("return _item")],loc:Yu},i.arguments.push(e,ec("_cache"),ec(String(n.cached++)))}else i.arguments.push(rc(od(t.parseResult),l,!0))}}))}));function rd(e,t){e.finalized||(e.finalized=!0)}function od({value:e,key:t,index:n},r=[]){return function(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map(((e,t)=>e||ec("_".repeat(t+1),!1)))}([e,t,n,...r])}const id=ec("undefined",!1),sd=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=Rc(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},ad=(e,t,n,r)=>rc(e,n,!1,!0,n.length?n[0].loc:r);function ld(e,t,n=ad){t.helper($u);const{children:r,loc:o}=e,i=[],s=[];let a=t.scopes.vSlot>0||t.scopes.vFor>0;const l=Rc(e,"slot",!0);if(l){const{arg:e,exp:t}=l;e&&!Cc(e)&&(a=!0),i.push(Xu(e||ec("default",!0),n(t,void 0,r,o)))}let u=!1,c=!1;const f=[],d=new Set;let p=0;for(let e=0;e{const i=n(e,void 0,r,o);return t.compatConfig&&(i.isNonScopedSlot=!0),Xu("default",i)};u?f.length&&f.some((e=>fd(e)))&&(c?t.onError(wc(39,f[0].loc)):i.push(e(void 0,f))):i.push(e(void 0,r))}const h=a?2:cd(e.children)?3:1;let v=Qu(i.concat(Xu("_",ec(h+"",!1))),o);return s.length&&(v=nc(t.helper(Au),[v,Ju(s)])),{slots:v,hasDynamicSlots:a}}function ud(e,t,n){const r=[Xu("name",e),Xu("fn",t)];return null!=n&&r.push(Xu("key",ec(String(n),!0))),Qu(r)}function cd(e){for(let t=0;tfunction(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:r}=e,o=1===e.tagType;let i=o?function(e,t,n=!1){let{tag:r}=e;const o=md(r),i=Ic(e,"is",!1,!0);if(i)if(o||gc("COMPILER_IS_ON_ELEMENT",t)){let e;if(6===i.type?e=i.value&&ec(i.value.content,!0):(e=i.exp,e||(e=ec("is",!1,i.arg.loc))),e)return nc(t.helper(xu),[e])}else 6===i.type&&i.value.content.startsWith("vue:")&&(r=i.value.content.slice(4));const s=_c(r)||t.isBuiltInComponent(r);if(s)return n||t.helper(s),s;return t.helper(_u),t.components.add(r),$c(r,"component")}(e,t):`"${n}"`;const s=x(i)&&i.callee===xu;let a,l,u,c,f,d=0,p=s||i===cu||i===fu||!o&&("svg"===n||"foreignObject"===n||"math"===n);if(r.length>0){const n=hd(e,t,void 0,o,s);a=n.props,d=n.patchFlag,c=n.dynamicPropNames;const r=n.directives;f=r&&r.length?Ju(r.map((e=>function(e,t){const n=[],r=dd.get(e);r?n.push(t.helperString(r)):(t.helper(Su),t.directives.add(e.name),n.push($c(e.name,"directive")));const{loc:o}=e;e.exp&&n.push(e.exp);e.arg&&(e.exp||n.push("void 0"),n.push(e.arg));if(Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=ec("true",!1,o);n.push(Qu(e.modifiers.map((e=>Xu(e,t))),o))}return Ju(n,e.loc)}(e,t)))):void 0,n.shouldUseBlock&&(p=!0)}if(e.children.length>0){i===du&&(p=!0,d|=1024);if(o&&i!==cu&&i!==du){const{slots:n,hasDynamicSlots:r}=ld(e,t);l=n,r&&(d|=1024)}else if(1===e.children.length&&i!==cu){const n=e.children[0],r=n.type,o=5===r||8===r;o&&0===Lf(n,t)&&(d|=1),l=o||2===r?n:e.children}else l=e.children}c&&c.length&&(u=function(e){let t="[";for(let n=0,r=e.length;n0;let h=!1,v=0,g=!1,m=!1,y=!1,b=!1,w=!1,C=!1;const x=[],S=e=>{u.length&&(f.push(Qu(vd(u),a)),u=[]),e&&f.push(e)},k=()=>{t.scopes.vFor>0&&u.push(Xu(ec("ref_for",!0),ec("true")))},O=({key:e,value:n})=>{if(Cc(e)){const i=e.content,s=c(i);if(!s||r&&!o||"onclick"===i.toLowerCase()||"onUpdate:modelValue"===i||L(i)||(b=!0),s&&L(i)&&(C=!0),s&&14===n.type&&(n=n.arguments[0]),20===n.type||(4===n.type||8===n.type)&&Lf(n,t)>0)return;"ref"===i?g=!0:"class"===i?m=!0:"style"===i?y=!0:"key"===i||x.includes(i)||x.push(i),!r||"class"!==i&&"style"!==i||x.includes(i)||x.push(i)}else w=!0};for(let o=0;o1?nc(t.helper(Pu),f,a):f[0]):u.length&&(E=Qu(vd(u),a)),w?v|=16:(m&&!r&&(v|=2),y&&!r&&(v|=4),x.length&&(v|=8),b&&(v|=32)),h||0!==v&&32!==v||!(g||C||d.length>0)||(v|=512),!t.inSSR&&E)switch(E.type){case 15:let e=-1,n=-1,r=!1;for(let t=0;t{if(Dc(e)){const{children:n,loc:r}=e,{slotName:o,slotProps:i}=function(e,t){let n,r='"default"';const o=[];for(let t=0;t0){const{props:r,directives:i}=hd(e,t,o,!1,!1);n=r,i.length&&t.onError(wc(36,i[0].loc))}return{slotName:r,slotProps:n}}(e,t),s=[t.prefixIdentifiers?"_ctx.$slots":"$slots",o,"{}","undefined","true"];let a=2;i&&(s[2]=i,a=3),n.length&&(s[3]=rc([],n,!1,!1,r),a=4),t.scopeId&&!t.slotted&&(a=5),s.splice(a),e.codegenNode=nc(t.helper(Tu),s,r)}};const bd=(e,t,n,r)=>{const{loc:o,modifiers:i,arg:s}=e;let a;if(e.exp||i.length||n.onError(wc(35,o)),4===s.type)if(s.isStatic){let e=s.content;0,e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`);a=ec(0!==t.tagType||e.startsWith("vnode")||!/[A-Z]/.test(e)?D(j(e)):`on:${e}`,!0,s.loc)}else a=tc([`${n.helperString(Bu)}(`,s,")"]);else a=s,a.children.unshift(`${n.helperString(Bu)}(`),a.children.push(")");let l=e.exp;l&&!l.content.trim()&&(l=void 0);let u=n.cacheHandlers&&!l&&!n.inVOnce;if(l){const e=Ac(l),t=!(e||Pc(l)),n=l.content.includes(";");0,(t||u&&e)&&(l=tc([`${t?"$event":"(...args)"} => ${n?"{":"("}`,l,n?"}":")"]))}let c={props:[Xu(a,l||ec("() => {}",!1,o))]};return r&&(c=r(c)),u&&(c.props[0].value=n.cache(c.props[0].value)),c.props.forEach((e=>e.key.isHandlerKey=!0)),c},wd=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let r,o=!1;for(let e=0;e7===e.type&&!t.directiveTransforms[e.name]))||"template"===e.tag)))for(let e=0;e{if(1===e.type&&Rc(e,"once",!0)){if(Cd.has(e)||t.inVOnce||t.inSSR)return;return Cd.add(e),t.inVOnce=!0,t.helper(Uu),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},xd=(e,t,n)=>{const{exp:r,arg:o}=e;if(!r)return n.onError(wc(41,e.loc)),Sd();const i=r.loc.source,s=4===r.type?r.content:i,a=n.bindingMetadata[i];if("props"===a||"props-aliased"===a)return n.onError(wc(44,r.loc)),Sd();if(!s.trim()||!Ac(r))return n.onError(wc(42,r.loc)),Sd();const l=o||ec("modelValue",!0),u=o?Cc(o)?`onUpdate:${j(o.content)}`:tc(['"onUpdate:" + ',o]):"onUpdate:modelValue";let c;c=tc([`${n.isTS?"($event: any)":"$event"} => ((`,r,") = $event)"]);const f=[Xu(l,e.exp),Xu(u,c)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(Sc(e)?e:JSON.stringify(e))+": true")).join(", "),n=o?Cc(o)?`${o.content}Modifiers`:tc([o,' + "Modifiers"']):"modelModifiers";f.push(Xu(n,ec(`{ ${t} }`,!1,e.loc,2)))}return Sd(f)};function Sd(e=[]){return{props:e}}const kd=/[\w).+\-_$\]]/,Od=(e,t)=>{gc("COMPILER_FILTERS",t)&&(5===e.type?Ed(e.content,t):1===e.type&&e.props.forEach((e=>{7===e.type&&"for"!==e.name&&e.exp&&Ed(e.exp,t)})))};function Ed(e,t){if(4===e.type)Td(e,t);else for(let n=0;n=0&&(e=n.charAt(t)," "===e);t--);e&&kd.test(e)||(c=!0)}}else void 0===s?(h=i+1,s=n.slice(0,i).trim()):g();function g(){v.push(n.slice(h,i).trim()),h=i+1}if(void 0===s?s=n.slice(0,i).trim():0!==h&&g(),v.length){for(i=0;i{if(1===e.type){const n=Rc(e,"memo");if(!n||Ld.has(e))return;return Ld.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&ac(r,t),e.codegenNode=nc(t.helper(Wu),[n.exp,rc(void 0,r),"_cache",String(t.cached++)]))}}};function Rd(e,t={}){const n=t.onError||yc,r="module"===t.mode;!0===t.prefixIdentifiers?n(wc(47)):r&&n(wc(48));t.cacheHandlers&&n(wc(49)),t.scopeId&&!r&&n(wc(50));const o=d({},t,{prefixIdentifiers:!1}),i=C(e)?Of(e,o):e,[s,a]=[[_d,Yf,Pd,nd,Od,yd,pd,sd,wd],{on:bd,bind:Xf,model:xd}];return Mf(i,d({},o,{nodeTransforms:[...s,...t.nodeTransforms||[]],directiveTransforms:d({},a,t.directiveTransforms||{})})),Vf(i,o)}const Id=Symbol(""),jd=Symbol(""),Nd=Symbol(""),Md=Symbol(""),Fd=Symbol(""),Dd=Symbol(""),Bd=Symbol(""),Ud=Symbol(""),Vd=Symbol(""),Hd=Symbol("");var $d;let qd;$d={[Id]:"vModelRadio",[jd]:"vModelCheckbox",[Nd]:"vModelText",[Md]:"vModelSelect",[Fd]:"vModelDynamic",[Dd]:"withModifiers",[Bd]:"withKeys",[Ud]:"vShow",[Vd]:"Transition",[Hd]:"TransitionGroup"},Object.getOwnPropertySymbols($d).forEach((e=>{Ku[e]=$d[e]}));const zd={parseMode:"html",isVoidTag:oe,isNativeTag:e=>te(e)||ne(e)||re(e),isPreTag:e=>"pre"===e,decodeEntities:function(e,t=!1){return qd||(qd=document.createElement("div")),t?(qd.innerHTML=`
`,qd.children[0].getAttribute("foo")):(qd.innerHTML=e,qd.textContent)},isBuiltInComponent:e=>"Transition"===e||"transition"===e?Vd:"TransitionGroup"===e||"transition-group"===e?Hd:void 0,getNamespace(e,t,n){let r=t?t.ns:n;if(t&&2===r)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(r=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(r=0);else t&&1===r&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(r=0));if(0===r){if("svg"===e)return 1;if("math"===e)return 2}return r}},Wd=(e,t)=>{const n=Q(e);return ec(JSON.stringify(n),!1,t,3)};function Zd(e,t){return wc(e,t)}const Kd=i("passive,once,capture"),Yd=i("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),Gd=i("left,right"),Jd=i("onkeyup,onkeydown,onkeypress",!0),Qd=(e,t)=>Cc(e)&&"onclick"===e.content.toLowerCase()?ec(t,!0):4!==e.type?tc(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e;const Xd=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||t.removeNode()},ep=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:ec("style",!0,t.loc),exp:Wd(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],tp={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(Zd(53,o)),t.children.length&&(n.onError(Zd(54,o)),t.children.length=0),{props:[Xu(ec("innerHTML",!0,o),r||ec("",!0))]}},text:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(Zd(55,o)),t.children.length&&(n.onError(Zd(56,o)),t.children.length=0),{props:[Xu(ec("textContent",!0),r?Lf(r,n)>0?r:nc(n.helperString(Lu),[r],o):ec("",!0))]}},model:(e,t,n)=>{const r=xd(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(Zd(58,e.arg.loc));const{tag:o}=t,i=n.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||i){let s=Nd,a=!1;if("input"===o||i){const r=Ic(t,"type");if(r){if(7===r.type)s=Fd;else if(r.value)switch(r.value.content){case"radio":s=Id;break;case"checkbox":s=jd;break;case"file":a=!0,n.onError(Zd(59,e.loc))}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(s=Fd)}else"select"===o&&(s=Md);a||(r.needRuntime=n.helper(s))}else n.onError(Zd(57,e.loc));return r.props=r.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),r},on:(e,t,n)=>bd(e,t,n,(t=>{const{modifiers:r}=e;if(!r.length)return t;let{key:o,value:i}=t.props[0];const{keyModifiers:s,nonKeyModifiers:a,eventOptionModifiers:l}=((e,t,n)=>{const r=[],o=[],i=[];for(let s=0;s{const{exp:r,loc:o}=e;return r||n.onError(Zd(61,o)),{props:[],needRuntime:n.helper(Ud)}}};const np=new WeakMap;ea((function(e,t){if(!C(e)){if(!e.nodeType)return l;e=e.innerHTML}const n=e,o=function(e){let t=np.get(null!=e?e:s);return t||(t=Object.create(null),np.set(null!=e?e:s,t)),t}(t),i=o[n];if(i)return i;if("#"===e[0]){const t=document.querySelector(e);0,e=t?t.innerHTML:""}const a=d({hoistStatic:!0,onError:void 0,onWarn:l},t);a.isCustomElement||"undefined"==typeof customElements||(a.isCustomElement=e=>!!customElements.get(e));const{code:u}=function(e,t={}){return Rd(e,d({},zd,t,{nodeTransforms:[Xd,...ep,...t.nodeTransforms||[]],directiveTransforms:d({},tp,t.directiveTransforms||{}),transformHoist:null}))}(e,a),c=new Function("Vue",u)(r);return c._rc=!0,o[n]=c}));var rp=!1;function op(e,t,n){return Array.isArray(e)?(e.length=Math.max(e.length,t),e.splice(t,1,n),n):(e[t]=n,n)}let ip;const sp=e=>ip=e,ap=Symbol();function lp(e){return e&&"object"==typeof e&&"[object Object]"===Object.prototype.toString.call(e)&&"function"!=typeof e.toJSON}var up;!function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"}(up||(up={}));const cp="undefined"!=typeof window,fp=(()=>"object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:"object"==typeof globalThis?globalThis:{HTMLElement:null})();function dp(e,t,n){const r=new XMLHttpRequest;r.open("GET",e),r.responseType="blob",r.onload=function(){mp(r.response,t,n)},r.onerror=function(){},r.send()}function pp(e){const t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch(e){}return t.status>=200&&t.status<=299}function hp(e){try{e.dispatchEvent(new MouseEvent("click"))}catch(t){const n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),e.dispatchEvent(n)}}const vp="object"==typeof navigator?navigator:{userAgent:""},gp=(()=>/Macintosh/.test(vp.userAgent)&&/AppleWebKit/.test(vp.userAgent)&&!/Safari/.test(vp.userAgent))(),mp=cp?"undefined"!=typeof HTMLAnchorElement&&"download"in HTMLAnchorElement.prototype&&!gp?function(e,t="download",n){const r=document.createElement("a");r.download=t,r.rel="noopener","string"==typeof e?(r.href=e,r.origin!==location.origin?pp(r.href)?dp(e,t,n):(r.target="_blank",hp(r)):hp(r)):(r.href=URL.createObjectURL(e),setTimeout((function(){URL.revokeObjectURL(r.href)}),4e4),setTimeout((function(){hp(r)}),0))}:"msSaveOrOpenBlob"in vp?function(e,t="download",n){if("string"==typeof e)if(pp(e))dp(e,t,n);else{const t=document.createElement("a");t.href=e,t.target="_blank",setTimeout((function(){hp(t)}))}else navigator.msSaveOrOpenBlob(function(e,{autoBom:t=!1}={}){return t&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([String.fromCharCode(65279),e],{type:e.type}):e}(e,n),t)}:function(e,t,n,r){(r=r||open("","_blank"))&&(r.document.title=r.document.body.innerText="downloading...");if("string"==typeof e)return dp(e,t,n);const o="application/octet-stream"===e.type,i=/constructor/i.test(String(fp.HTMLElement))||"safari"in fp,s=/CriOS\/[\d]+/.test(navigator.userAgent);if((s||o&&i||gp)&&"undefined"!=typeof FileReader){const t=new FileReader;t.onloadend=function(){let e=t.result;if("string"!=typeof e)throw r=null,new Error("Wrong reader.result type");e=s?e:e.replace(/^data:[^;]*;/,"data:attachment/file;"),r?r.location.href=e:location.assign(e),r=null},t.readAsDataURL(e)}else{const t=URL.createObjectURL(e);r?r.location.assign(t):location.href=t,r=null,setTimeout((function(){URL.revokeObjectURL(t)}),4e4)}}:()=>{};const{assign:yp}=Object;const bp=()=>{};function wp(e,t,n,r=bp){e.push(t);const o=()=>{const n=e.indexOf(t);n>-1&&(e.splice(n,1),r())};return!n&&_e()&&xe(o),o}function Cp(e,...t){e.slice().forEach((e=>{e(...t)}))}const _p=e=>e(),xp=Symbol(),Sp=Symbol();function kp(e,t){e instanceof Map&&t instanceof Map?t.forEach(((t,n)=>e.set(n,t))):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],o=e[n];lp(o)&&lp(r)&&e.hasOwnProperty(n)&&!Kt(r)&&!Mt(r)?e[n]=kp(o,r):e[n]=r}return e}const Op=Symbol(),Ep=new WeakMap;const{assign:Tp}=Object;function Ap(e){return!(!Kt(e)||!e.effect)}function Lp(e,t,n={},r,o,i){let s;const a=Tp({actions:{}},n);const l={deep:!0};let u,c;let f,d=[],p=[];const h=r.state.value[e];i||h||(rp?op(r.state.value,e,{}):r.state.value[e]={});Yt({});let v;function g(t){let n;u=c=!1,"function"==typeof t?(t(r.state.value[e]),n={type:up.patchFunction,storeId:e,events:f}):(kp(r.state.value[e],t),n={type:up.patchObject,payload:t,storeId:e,events:f});const o=v=Symbol();jn().then((()=>{v===o&&(u=!0)})),c=!0,Cp(d,n,r.state.value[e])}const m=i?function(){const{state:e}=n,t=e?e():{};this.$patch((e=>{Tp(e,t)}))}:bp;const y=(t,n="")=>{if(xp in t)return t[Sp]=n,t;const o=function(){sp(r);const n=Array.from(arguments),i=[],s=[];let a;Cp(p,{args:n,name:o[Sp],store:w,after:function(e){i.push(e)},onError:function(e){s.push(e)}});try{a=t.apply(this&&this.$id===e?this:w,n)}catch(e){throw Cp(s,e),e}return a instanceof Promise?a.then((e=>(Cp(i,e),e))).catch((e=>(Cp(s,e),Promise.reject(e)))):(Cp(i,a),a)};return o[xp]=!0,o[Sp]=n,o},b={_p:r,$id:e,$onAction:wp.bind(null,p),$patch:g,$reset:m,$subscribe(t,n={}){const o=wp(d,t,n.detached,(()=>i())),i=s.run((()=>Fi((()=>r.state.value[e]),(r=>{("sync"===n.flush?c:u)&&t({storeId:e,type:up.direct,events:f},r)}),Tp({},l,n))));return o},$dispose:function(){s.stop(),d=[],p=[],r._s.delete(e)}};rp&&(b._r=!1);const w=Pt(b);r._s.set(e,w);const C=(r._a&&r._a.runWithContext||_p)((()=>r._e.run((()=>(s=we()).run((()=>t({action:y})))))));for(const t in C){const n=C[t];if(Kt(n)&&!Ap(n)||Mt(n))i||(!h||(_=n,rp?Ep.has(_):lp(_)&&_.hasOwnProperty(Op))||(Kt(n)?n.value=h[t]:kp(n,h[t])),rp?op(r.state.value[e],t,n):r.state.value[e][t]=n);else if("function"==typeof n){const e=y(n,t);rp?op(C,t,e):C[t]=e,a.actions[t]=n}else 0}var _;return rp?Object.keys(C).forEach((e=>{op(w,e,C[e])})):(Tp(w,C),Tp(Ut(w),C)),Object.defineProperty(w,"$state",{get:()=>r.state.value[e],set:e=>{g((t=>{Tp(t,e)}))}}),rp&&(w._r=!0),r._p.forEach((e=>{Tp(w,s.run((()=>e({store:w,app:r._a,pinia:r,options:a}))))})),h&&i&&n.hydrate&&n.hydrate(w.$state,h),u=!0,c=!0,w}function Pp(e,t,n){let r,o;const i="function"==typeof t;function s(e,n){const s=Do();(e=e||(s?Fo(ap,null):null))&&sp(e),(e=ip)._s.has(r)||(i?Lp(r,t,o,e):function(e,t,n){const{state:r,actions:o,getters:i}=t,s=n.state.value[e];let a;a=Lp(e,(function(){s||(rp?op(n.state.value,e,r?r():{}):n.state.value[e]=r?r():{});const t=an(n.state.value[e]);return Tp(t,o,Object.keys(i||{}).reduce(((t,r)=>(t[r]=Vt(fa((()=>{sp(n);const t=n._s.get(e);if(!rp||t._r)return i[r].call(t,t)}))),t)),{}))}),t,n,0,!0)}(r,o,e));return e._s.get(r)}return"string"==typeof e?(r=e,o=i?n:t):(o=e,r=e.id),s.$id=r,s}function Rp(e,t){return function(){return e.apply(t,arguments)}}var Ip=n(606);const{toString:jp}=Object.prototype,{getPrototypeOf:Np}=Object,Mp=(Fp=Object.create(null),e=>{const t=jp.call(e);return Fp[t]||(Fp[t]=t.slice(8,-1).toLowerCase())});var Fp;const Dp=e=>(e=e.toLowerCase(),t=>Mp(t)===e),Bp=e=>t=>typeof t===e,{isArray:Up}=Array,Vp=Bp("undefined");const Hp=Dp("ArrayBuffer");const $p=Bp("string"),qp=Bp("function"),zp=Bp("number"),Wp=e=>null!==e&&"object"==typeof e,Zp=e=>{if("object"!==Mp(e))return!1;const t=Np(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)},Kp=Dp("Date"),Yp=Dp("File"),Gp=Dp("Blob"),Jp=Dp("FileList"),Qp=Dp("URLSearchParams"),[Xp,eh,th,nh]=["ReadableStream","Request","Response","Headers"].map(Dp);function rh(e,t,{allOwnKeys:n=!1}={}){if(null==e)return;let r,o;if("object"!=typeof e&&(e=[e]),Up(e))for(r=0,o=e.length;r0;)if(r=n[o],t===r.toLowerCase())return r;return null}const ih="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,sh=e=>!Vp(e)&&e!==ih;const ah=(lh="undefined"!=typeof Uint8Array&&Np(Uint8Array),e=>lh&&e instanceof lh);var lh;const uh=Dp("HTMLFormElement"),ch=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),fh=Dp("RegExp"),dh=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};rh(n,((n,o)=>{let i;!1!==(i=t(n,o,e))&&(r[o]=i||n)})),Object.defineProperties(e,r)},ph="abcdefghijklmnopqrstuvwxyz",hh="0123456789",vh={DIGIT:hh,ALPHA:ph,ALPHA_DIGIT:ph+ph.toUpperCase()+hh};const gh=Dp("AsyncFunction"),mh=(yh="function"==typeof setImmediate,bh=qp(ih.postMessage),yh?setImmediate:bh?((e,t)=>(ih.addEventListener("message",(({source:n,data:r})=>{n===ih&&r===e&&t.length&&t.shift()()}),!1),n=>{t.push(n),ih.postMessage(e,"*")}))(`axios@${Math.random()}`,[]):e=>setTimeout(e));var yh,bh;const wh="undefined"!=typeof queueMicrotask?queueMicrotask.bind(ih):void 0!==Ip&&Ip.nextTick||mh,Ch={isArray:Up,isArrayBuffer:Hp,isBuffer:function(e){return null!==e&&!Vp(e)&&null!==e.constructor&&!Vp(e.constructor)&&qp(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{let t;return e&&("function"==typeof FormData&&e instanceof FormData||qp(e.append)&&("formdata"===(t=Mp(e))||"object"===t&&qp(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&Hp(e.buffer),t},isString:$p,isNumber:zp,isBoolean:e=>!0===e||!1===e,isObject:Wp,isPlainObject:Zp,isReadableStream:Xp,isRequest:eh,isResponse:th,isHeaders:nh,isUndefined:Vp,isDate:Kp,isFile:Yp,isBlob:Gp,isRegExp:fh,isFunction:qp,isStream:e=>Wp(e)&&qp(e.pipe),isURLSearchParams:Qp,isTypedArray:ah,isFileList:Jp,forEach:rh,merge:function e(){const{caseless:t}=sh(this)&&this||{},n={},r=(r,o)=>{const i=t&&oh(n,o)||o;Zp(n[i])&&Zp(r)?n[i]=e(n[i],r):Zp(r)?n[i]=e({},r):Up(r)?n[i]=r.slice():n[i]=r};for(let e=0,t=arguments.length;e(rh(t,((t,r)=>{n&&qp(t)?e[r]=Rp(t,n):e[r]=t}),{allOwnKeys:r}),e),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,n,r)=>{let o,i,s;const a={};if(t=t||{},null==e)return t;do{for(o=Object.getOwnPropertyNames(e),i=o.length;i-- >0;)s=o[i],r&&!r(s,e,t)||a[s]||(t[s]=e[s],a[s]=!0);e=!1!==n&&Np(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:Mp,kindOfTest:Dp,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(Up(e))return e;let t=e.length;if(!zp(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[Symbol.iterator]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:uh,hasOwnProperty:ch,hasOwnProp:ch,reduceDescriptors:dh,freezeMethods:e=>{dh(e,((t,n)=>{if(qp(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];qp(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach((e=>{n[e]=!0}))};return Up(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n})),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:oh,global:ih,isContextDefined:sh,ALPHABET:vh,generateString:(e=16,t=vh.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n},isSpecCompliantForm:function(e){return!!(e&&qp(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:e=>{const t=new Array(10),n=(e,r)=>{if(Wp(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[r]=e;const o=Up(e)?[]:{};return rh(e,((e,t)=>{const i=n(e,r+1);!Vp(i)&&(o[t]=i)})),t[r]=void 0,o}}return e};return n(e,0)},isAsyncFn:gh,isThenable:e=>e&&(Wp(e)||qp(e))&&qp(e.then)&&qp(e.catch),setImmediate:mh,asap:wh};function _h(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}Ch.inherits(_h,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:Ch.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const xh=_h.prototype,Sh={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((e=>{Sh[e]={value:e}})),Object.defineProperties(_h,Sh),Object.defineProperty(xh,"isAxiosError",{value:!0}),_h.from=(e,t,n,r,o,i)=>{const s=Object.create(xh);return Ch.toFlatObject(e,s,(function(e){return e!==Error.prototype}),(e=>"isAxiosError"!==e)),_h.call(s,e.message,t,n,r,o),s.cause=e,s.name=e.name,i&&Object.assign(s,i),s};const kh=_h;var Oh=n(287).hp;function Eh(e){return Ch.isPlainObject(e)||Ch.isArray(e)}function Th(e){return Ch.endsWith(e,"[]")?e.slice(0,-2):e}function Ah(e,t,n){return e?e.concat(t).map((function(e,t){return e=Th(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}const Lh=Ch.toFlatObject(Ch,{},null,(function(e){return/^is[A-Z]/.test(e)}));const Ph=function(e,t,n){if(!Ch.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(n=Ch.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!Ch.isUndefined(t[e])}))).metaTokens,o=n.visitor||u,i=n.dots,s=n.indexes,a=(n.Blob||"undefined"!=typeof Blob&&Blob)&&Ch.isSpecCompliantForm(t);if(!Ch.isFunction(o))throw new TypeError("visitor must be a function");function l(e){if(null===e)return"";if(Ch.isDate(e))return e.toISOString();if(!a&&Ch.isBlob(e))throw new kh("Blob is not supported. Use a Buffer instead.");return Ch.isArrayBuffer(e)||Ch.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):Oh.from(e):e}function u(e,n,o){let a=e;if(e&&!o&&"object"==typeof e)if(Ch.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(Ch.isArray(e)&&function(e){return Ch.isArray(e)&&!e.some(Eh)}(e)||(Ch.isFileList(e)||Ch.endsWith(n,"[]"))&&(a=Ch.toArray(e)))return n=Th(n),a.forEach((function(e,r){!Ch.isUndefined(e)&&null!==e&&t.append(!0===s?Ah([n],r,i):null===s?n:n+"[]",l(e))})),!1;return!!Eh(e)||(t.append(Ah(o,n,i),l(e)),!1)}const c=[],f=Object.assign(Lh,{defaultVisitor:u,convertValue:l,isVisitable:Eh});if(!Ch.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!Ch.isUndefined(n)){if(-1!==c.indexOf(n))throw Error("Circular reference detected in "+r.join("."));c.push(n),Ch.forEach(n,(function(n,i){!0===(!(Ch.isUndefined(n)||null===n)&&o.call(t,n,Ch.isString(i)?i.trim():i,r,f))&&e(n,r?r.concat(i):[i])})),c.pop()}}(e),t};function Rh(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function Ih(e,t){this._pairs=[],e&&Ph(e,this,t)}const jh=Ih.prototype;jh.append=function(e,t){this._pairs.push([e,t])},jh.toString=function(e){const t=e?function(t){return e.call(this,t,Rh)}:Rh;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};const Nh=Ih;function Mh(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Fh(e,t,n){if(!t)return e;const r=n&&n.encode||Mh,o=n&&n.serialize;let i;if(i=o?o(t,n):Ch.isURLSearchParams(t)?t.toString():new Nh(t,n).toString(r),i){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}const Dh=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){Ch.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},Bh={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Uh={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:Nh,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},Vh="undefined"!=typeof window&&"undefined"!=typeof document,Hh=($h="undefined"!=typeof navigator&&navigator.product,Vh&&["ReactNative","NativeScript","NS"].indexOf($h)<0);var $h;const qh="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,zh=Vh&&window.location.href||"http://localhost",Wh={...o,...Uh};const Zh=function(e){function t(e,n,r,o){let i=e[o++];if("__proto__"===i)return!0;const s=Number.isFinite(+i),a=o>=e.length;if(i=!i&&Ch.isArray(r)?r.length:i,a)return Ch.hasOwnProp(r,i)?r[i]=[r[i],n]:r[i]=n,!s;r[i]&&Ch.isObject(r[i])||(r[i]=[]);return t(e,n,r[i],o)&&Ch.isArray(r[i])&&(r[i]=function(e){const t={},n=Object.keys(e);let r;const o=n.length;let i;for(r=0;r{t(function(e){return Ch.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),r,n,0)})),n}return null};const Kh={transitional:Bh,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=Ch.isObject(e);o&&Ch.isHTMLForm(e)&&(e=new FormData(e));if(Ch.isFormData(e))return r?JSON.stringify(Zh(e)):e;if(Ch.isArrayBuffer(e)||Ch.isBuffer(e)||Ch.isStream(e)||Ch.isFile(e)||Ch.isBlob(e)||Ch.isReadableStream(e))return e;if(Ch.isArrayBufferView(e))return e.buffer;if(Ch.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let i;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return Ph(e,new Wh.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return Wh.isNode&&Ch.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((i=Ch.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return Ph(i?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),function(e,t,n){if(Ch.isString(e))try{return(t||JSON.parse)(e),Ch.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||Kh.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(Ch.isResponse(e)||Ch.isReadableStream(e))return e;if(e&&Ch.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw kh.from(e,kh.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Wh.classes.FormData,Blob:Wh.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};Ch.forEach(["delete","get","head","post","put","patch"],(e=>{Kh.headers[e]={}}));const Yh=Kh,Gh=Ch.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Jh=Symbol("internals");function Qh(e){return e&&String(e).trim().toLowerCase()}function Xh(e){return!1===e||null==e?e:Ch.isArray(e)?e.map(Xh):String(e)}function ev(e,t,n,r,o){return Ch.isFunction(r)?r.call(this,t,n):(o&&(t=n),Ch.isString(t)?Ch.isString(r)?-1!==t.indexOf(r):Ch.isRegExp(r)?r.test(t):void 0:void 0)}class tv{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function o(e,t,n){const o=Qh(t);if(!o)throw new Error("header name must be a non-empty string");const i=Ch.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=Xh(e))}const i=(e,t)=>Ch.forEach(e,((e,n)=>o(e,n,t)));if(Ch.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(Ch.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))i((e=>{const t={};let n,r,o;return e&&e.split("\n").forEach((function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&Gh[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)})),t})(e),t);else if(Ch.isHeaders(e))for(const[t,r]of e.entries())o(r,t,n);else null!=e&&o(t,e,n);return this}get(e,t){if(e=Qh(e)){const n=Ch.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(Ch.isFunction(t))return t.call(this,e,n);if(Ch.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=Qh(e)){const n=Ch.findKey(this,e);return!(!n||void 0===this[n]||t&&!ev(0,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function o(e){if(e=Qh(e)){const o=Ch.findKey(n,e);!o||t&&!ev(0,n[o],o,t)||(delete n[o],r=!0)}}return Ch.isArray(e)?e.forEach(o):o(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;for(;n--;){const o=t[n];e&&!ev(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}normalize(e){const t=this,n={};return Ch.forEach(this,((r,o)=>{const i=Ch.findKey(n,o);if(i)return t[i]=Xh(r),void delete t[o];const s=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,n)=>t.toUpperCase()+n))}(o):String(o).trim();s!==o&&delete t[o],t[s]=Xh(r),n[s]=!0})),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return Ch.forEach(this,((n,r)=>{null!=n&&!1!==n&&(t[r]=e&&Ch.isArray(n)?n.join(", "):n)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((([e,t])=>e+": "+t)).join("\n")}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const n=new this(e);return t.forEach((e=>n.set(e))),n}static accessor(e){const t=(this[Jh]=this[Jh]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=Qh(e);t[r]||(!function(e,t){const n=Ch.toCamelCase(" "+t);["get","set","has"].forEach((r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})}))}(n,e),t[r]=!0)}return Ch.isArray(e)?e.forEach(r):r(e),this}}tv.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),Ch.reduceDescriptors(tv.prototype,(({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}})),Ch.freezeMethods(tv);const nv=tv;function rv(e,t){const n=this||Yh,r=t||n,o=nv.from(r.headers);let i=r.data;return Ch.forEach(e,(function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)})),o.normalize(),i}function ov(e){return!(!e||!e.__CANCEL__)}function iv(e,t,n){kh.call(this,null==e?"canceled":e,kh.ERR_CANCELED,t,n),this.name="CanceledError"}Ch.inherits(iv,kh,{__CANCEL__:!0});const sv=iv;function av(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new kh("Request failed with status code "+n.status,[kh.ERR_BAD_REQUEST,kh.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}const lv=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,i=0,s=0;return t=void 0!==t?t:1e3,function(a){const l=Date.now(),u=r[s];o||(o=l),n[i]=a,r[i]=l;let c=s,f=0;for(;c!==i;)f+=n[c++],c%=e;if(i=(i+1)%e,i===s&&(s=(s+1)%e),l-o{o=i,n=null,r&&(clearTimeout(r),r=null),e.apply(null,t)};return[(...e)=>{const t=Date.now(),a=t-o;a>=i?s(e,t):(n=e,r||(r=setTimeout((()=>{r=null,s(n)}),i-a)))},()=>n&&s(n)]},cv=(e,t,n=3)=>{let r=0;const o=lv(50,250);return uv((n=>{const i=n.loaded,s=n.lengthComputable?n.total:void 0,a=i-r,l=o(a);r=i;e({loaded:i,total:s,progress:s?i/s:void 0,bytes:a,rate:l||void 0,estimated:l&&s&&i<=s?(s-i)/l:void 0,event:n,lengthComputable:null!=s,[t?"download":"upload"]:!0})}),n)},fv=(e,t)=>{const n=null!=e;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},dv=e=>(...t)=>Ch.asap((()=>e(...t))),pv=Wh.hasStandardBrowserEnv?function(){const e=/(msie|trident)/i.test(navigator.userAgent),t=document.createElement("a");let n;function r(n){let r=n;return e&&(t.setAttribute("href",r),r=t.href),t.setAttribute("href",r),{href:t.href,protocol:t.protocol?t.protocol.replace(/:$/,""):"",host:t.host,search:t.search?t.search.replace(/^\?/,""):"",hash:t.hash?t.hash.replace(/^#/,""):"",hostname:t.hostname,port:t.port,pathname:"/"===t.pathname.charAt(0)?t.pathname:"/"+t.pathname}}return n=r(window.location.href),function(e){const t=Ch.isString(e)?r(e):e;return t.protocol===n.protocol&&t.host===n.host}}():function(){return!0},hv=Wh.hasStandardBrowserEnv?{write(e,t,n,r,o,i){const s=[e+"="+encodeURIComponent(t)];Ch.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),Ch.isString(r)&&s.push("path="+r),Ch.isString(o)&&s.push("domain="+o),!0===i&&s.push("secure"),document.cookie=s.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function vv(e,t){return e&&!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const gv=e=>e instanceof nv?{...e}:e;function mv(e,t){t=t||{};const n={};function r(e,t,n){return Ch.isPlainObject(e)&&Ch.isPlainObject(t)?Ch.merge.call({caseless:n},e,t):Ch.isPlainObject(t)?Ch.merge({},t):Ch.isArray(t)?t.slice():t}function o(e,t,n){return Ch.isUndefined(t)?Ch.isUndefined(e)?void 0:r(void 0,e,n):r(e,t,n)}function i(e,t){if(!Ch.isUndefined(t))return r(void 0,t)}function s(e,t){return Ch.isUndefined(t)?Ch.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function a(n,o,i){return i in t?r(n,o):i in e?r(void 0,n):void 0}const l={url:i,method:i,data:i,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,withXSRFToken:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,beforeRedirect:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:a,headers:(e,t)=>o(gv(e),gv(t),!0)};return Ch.forEach(Object.keys(Object.assign({},e,t)),(function(r){const i=l[r]||o,s=i(e[r],t[r],r);Ch.isUndefined(s)&&i!==a||(n[r]=s)})),n}const yv=e=>{const t=mv({},e);let n,{data:r,withXSRFToken:o,xsrfHeaderName:i,xsrfCookieName:s,headers:a,auth:l}=t;if(t.headers=a=nv.from(a),t.url=Fh(vv(t.baseURL,t.url),e.params,e.paramsSerializer),l&&a.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),Ch.isFormData(r))if(Wh.hasStandardBrowserEnv||Wh.hasStandardBrowserWebWorkerEnv)a.setContentType(void 0);else if(!1!==(n=a.getContentType())){const[e,...t]=n?n.split(";").map((e=>e.trim())).filter(Boolean):[];a.setContentType([e||"multipart/form-data",...t].join("; "))}if(Wh.hasStandardBrowserEnv&&(o&&Ch.isFunction(o)&&(o=o(t)),o||!1!==o&&pv(t.url))){const e=i&&s&&hv.read(s);e&&a.set(i,e)}return t},bv="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,n){const r=yv(e);let o=r.data;const i=nv.from(r.headers).normalize();let s,a,l,u,c,{responseType:f,onUploadProgress:d,onDownloadProgress:p}=r;function h(){u&&u(),c&&c(),r.cancelToken&&r.cancelToken.unsubscribe(s),r.signal&&r.signal.removeEventListener("abort",s)}let v=new XMLHttpRequest;function g(){if(!v)return;const r=nv.from("getAllResponseHeaders"in v&&v.getAllResponseHeaders());av((function(e){t(e),h()}),(function(e){n(e),h()}),{data:f&&"text"!==f&&"json"!==f?v.response:v.responseText,status:v.status,statusText:v.statusText,headers:r,config:e,request:v}),v=null}v.open(r.method.toUpperCase(),r.url,!0),v.timeout=r.timeout,"onloadend"in v?v.onloadend=g:v.onreadystatechange=function(){v&&4===v.readyState&&(0!==v.status||v.responseURL&&0===v.responseURL.indexOf("file:"))&&setTimeout(g)},v.onabort=function(){v&&(n(new kh("Request aborted",kh.ECONNABORTED,e,v)),v=null)},v.onerror=function(){n(new kh("Network Error",kh.ERR_NETWORK,e,v)),v=null},v.ontimeout=function(){let t=r.timeout?"timeout of "+r.timeout+"ms exceeded":"timeout exceeded";const o=r.transitional||Bh;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new kh(t,o.clarifyTimeoutError?kh.ETIMEDOUT:kh.ECONNABORTED,e,v)),v=null},void 0===o&&i.setContentType(null),"setRequestHeader"in v&&Ch.forEach(i.toJSON(),(function(e,t){v.setRequestHeader(t,e)})),Ch.isUndefined(r.withCredentials)||(v.withCredentials=!!r.withCredentials),f&&"json"!==f&&(v.responseType=r.responseType),p&&([l,c]=cv(p,!0),v.addEventListener("progress",l)),d&&v.upload&&([a,u]=cv(d),v.upload.addEventListener("progress",a),v.upload.addEventListener("loadend",u)),(r.cancelToken||r.signal)&&(s=t=>{v&&(n(!t||t.type?new sv(null,e,v):t),v.abort(),v=null)},r.cancelToken&&r.cancelToken.subscribe(s),r.signal&&(r.signal.aborted?s():r.signal.addEventListener("abort",s)));const m=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(r.url);m&&-1===Wh.protocols.indexOf(m)?n(new kh("Unsupported protocol "+m+":",kh.ERR_BAD_REQUEST,e)):v.send(o||null)}))},wv=(e,t)=>{let n,r=new AbortController;const o=function(e){if(!n){n=!0,s();const t=e instanceof Error?e:this.reason;r.abort(t instanceof kh?t:new sv(t instanceof Error?t.message:t))}};let i=t&&setTimeout((()=>{o(new kh(`timeout ${t} of ms exceeded`,kh.ETIMEDOUT))}),t);const s=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach((e=>{e&&(e.removeEventListener?e.removeEventListener("abort",o):e.unsubscribe(o))})),e=null)};e.forEach((e=>e&&e.addEventListener&&e.addEventListener("abort",o)));const{signal:a}=r;return a.unsubscribe=s,[a,()=>{i&&clearTimeout(i),i=null}]},Cv=function*(e,t){let n=e.byteLength;if(!t||n{const i=async function*(e,t,n){for await(const r of e)yield*Cv(ArrayBuffer.isView(r)?r:await n(String(r)),t)}(e,t,o);let s,a=0,l=e=>{s||(s=!0,r&&r(e))};return new ReadableStream({async pull(e){try{const{done:t,value:r}=await i.next();if(t)return l(),void e.close();let o=r.byteLength;if(n){let e=a+=o;n(e)}e.enqueue(new Uint8Array(r))}catch(e){throw l(e),e}},cancel:e=>(l(e),i.return())},{highWaterMark:2})},xv="function"==typeof fetch&&"function"==typeof Request&&"function"==typeof Response,Sv=xv&&"function"==typeof ReadableStream,kv=xv&&("function"==typeof TextEncoder?(Ov=new TextEncoder,e=>Ov.encode(e)):async e=>new Uint8Array(await new Response(e).arrayBuffer()));var Ov;const Ev=(e,...t)=>{try{return!!e(...t)}catch(e){return!1}},Tv=Sv&&Ev((()=>{let e=!1;const t=new Request(Wh.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})),Av=Sv&&Ev((()=>Ch.isReadableStream(new Response("").body))),Lv={stream:Av&&(e=>e.body)};var Pv;xv&&(Pv=new Response,["text","arrayBuffer","blob","formData","stream"].forEach((e=>{!Lv[e]&&(Lv[e]=Ch.isFunction(Pv[e])?t=>t[e]():(t,n)=>{throw new kh(`Response type '${e}' is not supported`,kh.ERR_NOT_SUPPORT,n)})})));const Rv=async(e,t)=>{const n=Ch.toFiniteNumber(e.getContentLength());return null==n?(async e=>null==e?0:Ch.isBlob(e)?e.size:Ch.isSpecCompliantForm(e)?(await new Request(e).arrayBuffer()).byteLength:Ch.isArrayBufferView(e)||Ch.isArrayBuffer(e)?e.byteLength:(Ch.isURLSearchParams(e)&&(e+=""),Ch.isString(e)?(await kv(e)).byteLength:void 0))(t):n},Iv=xv&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:i,timeout:s,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:c,withCredentials:f="same-origin",fetchOptions:d}=yv(e);u=u?(u+"").toLowerCase():"text";let p,h,[v,g]=o||i||s?wv([o,i],s):[];const m=()=>{!p&&setTimeout((()=>{v&&v.unsubscribe()})),p=!0};let y;try{if(l&&Tv&&"get"!==n&&"head"!==n&&0!==(y=await Rv(c,r))){let e,n=new Request(t,{method:"POST",body:r,duplex:"half"});if(Ch.isFormData(r)&&(e=n.headers.get("content-type"))&&c.setContentType(e),n.body){const[e,t]=fv(y,cv(dv(l)));r=_v(n.body,65536,e,t,kv)}}Ch.isString(f)||(f=f?"include":"omit"),h=new Request(t,{...d,signal:v,method:n.toUpperCase(),headers:c.normalize().toJSON(),body:r,duplex:"half",credentials:f});let o=await fetch(h);const i=Av&&("stream"===u||"response"===u);if(Av&&(a||i)){const e={};["status","statusText","headers"].forEach((t=>{e[t]=o[t]}));const t=Ch.toFiniteNumber(o.headers.get("content-length")),[n,r]=a&&fv(t,cv(dv(a),!0))||[];o=new Response(_v(o.body,65536,n,(()=>{r&&r(),i&&m()}),kv),e)}u=u||"text";let s=await Lv[Ch.findKey(Lv,u)||"text"](o,e);return!i&&m(),g&&g(),await new Promise(((t,n)=>{av(t,n,{data:s,headers:nv.from(o.headers),status:o.status,statusText:o.statusText,config:e,request:h})}))}catch(t){if(m(),t&&"TypeError"===t.name&&/fetch/i.test(t.message))throw Object.assign(new kh("Network Error",kh.ERR_NETWORK,e,h),{cause:t.cause||t});throw kh.from(t,t&&t.code,e,h)}}),jv={http:null,xhr:bv,fetch:Iv};Ch.forEach(jv,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}}));const Nv=e=>`- ${e}`,Mv=e=>Ch.isFunction(e)||null===e||!1===e,Fv=e=>{e=Ch.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let i=0;i`adapter ${e} `+(!1===t?"is not supported by the environment":"is not available in the build")));let n=t?e.length>1?"since :\n"+e.map(Nv).join("\n"):" "+Nv(e[0]):"as no adapter specified";throw new kh("There is no suitable adapter to dispatch the request "+n,"ERR_NOT_SUPPORT")}return r};function Dv(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new sv(null,e)}function Bv(e){Dv(e),e.headers=nv.from(e.headers),e.data=rv.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return Fv(e.adapter||Yh.adapter)(e).then((function(t){return Dv(e),t.data=rv.call(e,e.transformResponse,t),t.headers=nv.from(t.headers),t}),(function(t){return ov(t)||(Dv(e),t&&t.response&&(t.response.data=rv.call(e,e.transformResponse,t.response),t.response.headers=nv.from(t.response.headers))),Promise.reject(t)}))}const Uv="1.7.4",Vv={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{Vv[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));const Hv={};Vv.transitional=function(e,t,n){return(r,o,i)=>{if(!1===e)throw new kh(function(e,t){return"[Axios v1.7.4] Transitional option '"+e+"'"+t+(n?". "+n:"")}(o," has been removed"+(t?" in "+t:"")),kh.ERR_DEPRECATED);return t&&!Hv[o]&&(Hv[o]=!0),!e||e(r,o,i)}};const $v={assertOptions:function(e,t,n){if("object"!=typeof e)throw new kh("options must be an object",kh.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const i=r[o],s=t[i];if(s){const t=e[i],n=void 0===t||s(t,i,e);if(!0!==n)throw new kh("option "+i+" must be "+n,kh.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new kh("Unknown option "+i,kh.ERR_BAD_OPTION)}},validators:Vv},qv=$v.validators;class zv{constructor(e){this.defaults=e,this.interceptors={request:new Dh,response:new Dh}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t;Error.captureStackTrace?Error.captureStackTrace(t={}):t=new Error;const n=t.stack?t.stack.replace(/^.+\n/,""):"";try{e.stack?n&&!String(e.stack).endsWith(n.replace(/^.+\n.+\n/,""))&&(e.stack+="\n"+n):e.stack=n}catch(e){}}throw e}}_request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=mv(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:o}=t;void 0!==n&&$v.assertOptions(n,{silentJSONParsing:qv.transitional(qv.boolean),forcedJSONParsing:qv.transitional(qv.boolean),clarifyTimeoutError:qv.transitional(qv.boolean)},!1),null!=r&&(Ch.isFunction(r)?t.paramsSerializer={serialize:r}:$v.assertOptions(r,{encode:qv.function,serialize:qv.function},!0)),t.method=(t.method||this.defaults.method||"get").toLowerCase();let i=o&&Ch.merge(o.common,o[t.method]);o&&Ch.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete o[e]})),t.headers=nv.concat(i,o);const s=[];let a=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(a=a&&e.synchronous,s.unshift(e.fulfilled,e.rejected))}));const l=[];let u;this.interceptors.response.forEach((function(e){l.push(e.fulfilled,e.rejected)}));let c,f=0;if(!a){const e=[Bv.bind(this),void 0];for(e.unshift.apply(e,s),e.push.apply(e,l),c=e.length,u=Promise.resolve(t);f{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null})),this.promise.then=e=>{let t;const r=new Promise((e=>{n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e,r,o){n.reason||(n.reason=new sv(e,r,o),t(n.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}static source(){let e;return{token:new Zv((function(t){e=t})),cancel:e}}}const Kv=Zv;const Yv={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Yv).forEach((([e,t])=>{Yv[t]=e}));const Gv=Yv;const Jv=function e(t){const n=new Wv(t),r=Rp(Wv.prototype.request,n);return Ch.extend(r,Wv.prototype,n,{allOwnKeys:!0}),Ch.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(mv(t,n))},r}(Yh);Jv.Axios=Wv,Jv.CanceledError=sv,Jv.CancelToken=Kv,Jv.isCancel=ov,Jv.VERSION=Uv,Jv.toFormData=Ph,Jv.AxiosError=kh,Jv.Cancel=Jv.CanceledError,Jv.all=function(e){return Promise.all(e)},Jv.spread=function(e){return function(t){return e.apply(null,t)}},Jv.isAxiosError=function(e){return Ch.isObject(e)&&!0===e.isAxiosError},Jv.mergeConfig=mv,Jv.AxiosHeaders=nv,Jv.formToJSON=e=>Zh(Ch.isHTMLForm(e)?new FormData(e):e),Jv.getAdapter=Fv,Jv.HttpStatusCode=Gv,Jv.default=Jv;const Qv=Jv,Xv="undefined"!=typeof document;function eg(e){return e.__esModule||"Module"===e[Symbol.toStringTag]}const tg=Object.assign;function ng(e,t){const n={};for(const r in t){const o=t[r];n[r]=og(o)?o.map(e):e(o)}return n}const rg=()=>{},og=Array.isArray;const ig=/#/g,sg=/&/g,ag=/\//g,lg=/=/g,ug=/\?/g,cg=/\+/g,fg=/%5B/g,dg=/%5D/g,pg=/%5E/g,hg=/%60/g,vg=/%7B/g,gg=/%7C/g,mg=/%7D/g,yg=/%20/g;function bg(e){return encodeURI(""+e).replace(gg,"|").replace(fg,"[").replace(dg,"]")}function wg(e){return bg(e).replace(cg,"%2B").replace(yg,"+").replace(ig,"%23").replace(sg,"%26").replace(hg,"`").replace(vg,"{").replace(mg,"}").replace(pg,"^")}function Cg(e){return null==e?"":function(e){return bg(e).replace(ig,"%23").replace(ug,"%3F")}(e).replace(ag,"%2F")}function _g(e){try{return decodeURIComponent(""+e)}catch(e){}return""+e}const xg=/\/$/,Sg=e=>e.replace(xg,"");function kg(e,t,n="/"){let r,o={},i="",s="";const a=t.indexOf("#");let l=t.indexOf("?");return a=0&&(l=-1),l>-1&&(r=t.slice(0,l),i=t.slice(l+1,a>-1?a:t.length),o=e(i)),a>-1&&(r=r||t.slice(0,a),s=t.slice(a,t.length)),r=function(e,t){if(e.startsWith("/"))return e;0;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];".."!==o&&"."!==o||r.push("");let i,s,a=n.length-1;for(i=0;i1&&a--}return n.slice(0,a).join("/")+"/"+r.slice(i).join("/")}(null!=r?r:t,n),{fullPath:r+(i&&"?")+i+s,path:r,query:o,hash:_g(s)}}function Og(e,t){return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}function Eg(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Tg(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!Ag(e[n],t[n]))return!1;return!0}function Ag(e,t){return og(e)?Lg(e,t):og(t)?Lg(t,e):e===t}function Lg(e,t){return og(t)?e.length===t.length&&e.every(((e,n)=>e===t[n])):1===e.length&&e[0]===t}const Pg={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var Rg,Ig;!function(e){e.pop="pop",e.push="push"}(Rg||(Rg={})),function(e){e.back="back",e.forward="forward",e.unknown=""}(Ig||(Ig={}));function jg(e){if(!e)if(Xv){const t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),Sg(e)}const Ng=/^[^#]+#/;function Mg(e,t){return e.replace(Ng,"#")+t}const Fg=()=>({left:window.scrollX,top:window.scrollY});function Dg(e){let t;if("el"in e){const n=e.el,r="string"==typeof n&&n.startsWith("#");0;const o="string"==typeof n?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=function(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.scrollX,null!=t.top?t.top:window.scrollY)}function Bg(e,t){return(history.state?history.state.position-t:-1)+e}const Ug=new Map;let Vg=()=>location.protocol+"//"+location.host;function Hg(e,t){const{pathname:n,search:r,hash:o}=t,i=e.indexOf("#");if(i>-1){let t=o.includes(e.slice(i))?e.slice(i).length:1,n=o.slice(t);return"/"!==n[0]&&(n="/"+n),Og(n,"")}return Og(n,e)+r+o}function $g(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?Fg():null}}function qg(e){const t=function(e){const{history:t,location:n}=window,r={value:Hg(e,n)},o={value:t.state};function i(r,i,s){const a=e.indexOf("#"),l=a>-1?(n.host&&document.querySelector("base")?e:e.slice(a))+r:Vg()+e+r;try{t[s?"replaceState":"pushState"](i,"",l),o.value=i}catch(e){n[s?"replace":"assign"](l)}}return o.value||i(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0),{location:r,state:o,push:function(e,n){const s=tg({},o.value,t.state,{forward:e,scroll:Fg()});i(s.current,s,!0),i(e,tg({},$g(r.value,e,null),{position:s.position+1},n),!1),r.value=e},replace:function(e,n){i(e,tg({},t.state,$g(o.value.back,e,o.value.forward,!0),n,{position:o.value.position}),!0),r.value=e}}}(e=jg(e)),n=function(e,t,n,r){let o=[],i=[],s=null;const a=({state:i})=>{const a=Hg(e,location),l=n.value,u=t.value;let c=0;if(i){if(n.value=a,t.value=i,s&&s===l)return void(s=null);c=u?i.position-u.position:0}else r(a);o.forEach((e=>{e(n.value,l,{delta:c,type:Rg.pop,direction:c?c>0?Ig.forward:Ig.back:Ig.unknown})}))};function l(){const{history:e}=window;e.state&&e.replaceState(tg({},e.state,{scroll:Fg()}),"")}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",l,{passive:!0}),{pauseListeners:function(){s=n.value},listen:function(e){o.push(e);const t=()=>{const t=o.indexOf(e);t>-1&&o.splice(t,1)};return i.push(t),t},destroy:function(){for(const e of i)e();i=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",l)}}}(e,t.state,t.location,t.replace);const r=tg({location:"",base:e,go:function(e,t=!0){t||n.pauseListeners(),history.go(e)},createHref:Mg.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}function zg(e){return"string"==typeof e||"symbol"==typeof e}const Wg=Symbol("");var Zg;!function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"}(Zg||(Zg={}));function Kg(e,t){return tg(new Error,{type:e,[Wg]:!0},t)}function Yg(e,t){return e instanceof Error&&Wg in e&&(null==t||!!(e.type&t))}const Gg="[^/]+?",Jg={sensitive:!1,strict:!1,start:!0,end:!0},Qg=/[.+*?^${}()[\]/\\]/g;function Xg(e,t){let n=0;for(;nt.length?1===t.length&&80===t[0]?1:-1:0}function em(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const nm={type:0,value:""},rm=/[a-zA-Z0-9_]/;function om(e,t,n){const r=function(e,t){const n=tg({},Jg,t),r=[];let o=n.start?"^":"";const i=[];for(const t of e){const e=t.length?[]:[90];n.strict&&!t.length&&(o+="/");for(let r=0;r1&&("*"===a||"+"===a)&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:u,regexp:c,repeatable:"*"===a||"+"===a,optional:"*"===a||"?"===a})):t("Invalid state to consume buffer"),u="")}function d(){u+=a}for(;l{i(d)}:rg}function i(e){if(zg(e)){const t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(i),t.alias.forEach(i))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(i),e.alias.forEach(i))}}function s(e){const t=function(e,t){let n=0,r=t.length;for(;n!==r;){const o=n+r>>1;em(e,t[o])<0?r=o:n=o+1}const o=function(e){let t=e;for(;t=t.parent;)if(fm(t)&&0===em(e,t))return t;return}(e);o&&(r=t.lastIndexOf(o,r-1));return r}(e,n);n.splice(t,0,e),e.record.name&&!lm(e)&&r.set(e.record.name,e)}return t=cm({strict:!1,end:!0,sensitive:!1},t),e.forEach((e=>o(e))),{addRoute:o,resolve:function(e,t){let o,i,s,a={};if("name"in e&&e.name){if(o=r.get(e.name),!o)throw Kg(1,{location:e});0,s=o.record.name,a=tg(sm(t.params,o.keys.filter((e=>!e.optional)).concat(o.parent?o.parent.keys.filter((e=>e.optional)):[]).map((e=>e.name))),e.params&&sm(e.params,o.keys.map((e=>e.name)))),i=o.stringify(a)}else if(null!=e.path)i=e.path,o=n.find((e=>e.re.test(i))),o&&(a=o.parse(i),s=o.record.name);else{if(o=t.name?r.get(t.name):n.find((e=>e.re.test(t.path))),!o)throw Kg(1,{location:e,currentLocation:t});s=o.record.name,a=tg({},t.params,e.params),i=o.stringify(a)}const l=[];let u=o;for(;u;)l.unshift(u.record),u=u.parent;return{name:s,path:i,params:a,matched:l,meta:um(l)}},removeRoute:i,clearRoutes:function(){n.length=0,r.clear()},getRoutes:function(){return n},getRecordMatcher:function(e){return r.get(e)}}}function sm(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function am(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]="object"==typeof n?n[r]:n;return t}function lm(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function um(e){return e.reduce(((e,t)=>tg(e,t.meta)),{})}function cm(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function fm({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function dm(e){const t={};if(""===e||"?"===e)return t;const n=("?"===e[0]?e.slice(1):e).split("&");for(let e=0;ee&&wg(e))):[r&&wg(r)];o.forEach((e=>{void 0!==e&&(t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))}))}return t}function hm(e){const t={};for(const n in e){const r=e[n];void 0!==r&&(t[n]=og(r)?r.map((e=>null==e?null:""+e)):null==r?r:""+r)}return t}const vm=Symbol(""),gm=Symbol(""),mm=Symbol(""),ym=Symbol(""),bm=Symbol("");function wm(){let e=[];return{add:function(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}},list:()=>e.slice(),reset:function(){e=[]}}}function Cm(e,t,n,r,o,i=e=>e()){const s=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise(((a,l)=>{const u=e=>{var i;!1===e?l(Kg(4,{from:n,to:t})):e instanceof Error?l(e):"string"==typeof(i=e)||i&&"object"==typeof i?l(Kg(2,{from:t,to:e})):(s&&r.enterCallbacks[o]===s&&"function"==typeof e&&s.push(e),a())},c=i((()=>e.call(r&&r.instances[o],t,n,u)));let f=Promise.resolve(c);e.length<3&&(f=f.then(u)),f.catch((e=>l(e)))}))}function _m(e,t,n,r,o=e=>e()){const i=[];for(const a of e){0;for(const e in a.components){let l=a.components[e];if("beforeRouteEnter"===t||a.instances[e])if("object"==typeof(s=l)||"displayName"in s||"props"in s||"__vccOpts"in s){const s=(l.__vccOpts||l)[t];s&&i.push(Cm(s,n,r,a,e,o))}else{let s=l();0,i.push((()=>s.then((i=>{if(!i)return Promise.reject(new Error(`Couldn't resolve component "${e}" at "${a.path}"`));const s=eg(i)?i.default:i;a.components[e]=s;const l=(s.__vccOpts||s)[t];return l&&Cm(l,n,r,a,e,o)()}))))}}}var s;return i}function xm(e){const t=Fo(mm),n=Fo(ym);const r=fa((()=>{const n=en(e.to);return t.resolve(n)})),o=fa((()=>{const{matched:e}=r.value,{length:t}=e,o=e[t-1],i=n.matched;if(!o||!i.length)return-1;const s=i.findIndex(Eg.bind(null,o));if(s>-1)return s;const a=km(e[t-2]);return t>1&&km(o)===a&&i[i.length-1].path!==a?i.findIndex(Eg.bind(null,e[t-2])):s})),i=fa((()=>o.value>-1&&function(e,t){for(const n in t){const r=t[n],o=e[n];if("string"==typeof r){if(r!==o)return!1}else if(!og(o)||o.length!==r.length||r.some(((e,t)=>e!==o[t])))return!1}return!0}(n.params,r.value.params))),s=fa((()=>o.value>-1&&o.value===n.matched.length-1&&Tg(n.params,r.value.params)));return{route:r,href:fa((()=>r.value.href)),isActive:i,isExactActive:s,navigate:function(n={}){return function(e){if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)return;if(e.defaultPrevented)return;if(void 0!==e.button&&0!==e.button)return;if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}e.preventDefault&&e.preventDefault();return!0}(n)?t[en(e.replace)?"replace":"push"](en(e.to)).catch(rg):Promise.resolve()}}}const Sm=hr({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:xm,setup(e,{slots:t}){const n=Pt(xm(e)),{options:r}=Fo(mm),o=fa((()=>({[Om(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Om(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive})));return()=>{const r=t.default&&t.default(n);return e.custom?r:da("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},r)}}});function km(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Om=(e,t,n)=>null!=e?e:null!=t?t:n;function Em(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}const Tm=hr({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Fo(bm),o=fa((()=>e.route||r.value)),i=Fo(gm,0),s=fa((()=>{let e=en(i);const{matched:t}=o.value;let n;for(;(n=t[e])&&!n.components;)e++;return e})),a=fa((()=>o.value.matched[s.value]));Mo(gm,fa((()=>s.value+1))),Mo(vm,a),Mo(bm,o);const l=Yt();return Fi((()=>[l.value,a.value,e.name]),(([e,t,n],[r,o,i])=>{t&&(t.instances[n]=e,o&&o!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=o.leaveGuards),t.updateGuards.size||(t.updateGuards=o.updateGuards))),!e||!t||o&&Eg(t,o)&&r||(t.enterCallbacks[n]||[]).forEach((t=>t(e)))}),{flush:"post"}),()=>{const r=o.value,i=e.name,s=a.value,u=s&&s.components[i];if(!u)return Em(n.default,{Component:u,route:r});const c=s.props[i],f=c?!0===c?r.params:"function"==typeof c?c(r):c:null,d=da(u,tg({},f,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(s.instances[i]=null)},ref:l}));return Em(n.default,{Component:d,route:r})||d}}});function Am(){return Fo(mm)}function Lm(e){return Fo(ym)}let Pm=Symbol("headlessui.useid"),Rm=0;function Im(){return Fo(Pm,(()=>""+ ++Rm))()}function jm(e){var t;if(null==e||null==e.value)return null;let n=null!=(t=e.value.$el)?t:e.value;return n instanceof Node?n:null}function Nm(e,t,...n){if(e in t){let r=t[e];return"function"==typeof r?r(...n):r}let r=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map((e=>`"${e}"`)).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,Nm),r}var Mm=Object.defineProperty,Fm=(e,t,n)=>(((e,t,n)=>{t in e?Mm(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n})(e,"symbol"!=typeof t?t+"":t,n),n);let Dm=new class{constructor(){Fm(this,"current",this.detect()),Fm(this,"currentId",0)}set(e){this.current!==e&&(this.currentId=0,this.current=e)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return"server"===this.current}get isClient(){return"client"===this.current}detect(){return"undefined"==typeof window||"undefined"==typeof document?"server":"client"}};function Bm(e){if(Dm.isServer)return null;if(e instanceof Node)return e.ownerDocument;if(null!=e&&e.hasOwnProperty("value")){let t=jm(e);if(t)return t.ownerDocument}return document}let Um=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map((e=>`${e}:not([tabindex='-1'])`)).join(",");var Vm=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e))(Vm||{}),Hm=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))(Hm||{}),$m=(e=>(e[e.Previous=-1]="Previous",e[e.Next=1]="Next",e))($m||{});function qm(e=document.body){return null==e?[]:Array.from(e.querySelectorAll(Um)).sort(((e,t)=>Math.sign((e.tabIndex||Number.MAX_SAFE_INTEGER)-(t.tabIndex||Number.MAX_SAFE_INTEGER))))}var zm=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))(zm||{});function Wm(e,t=0){var n;return e!==(null==(n=Bm(e))?void 0:n.body)&&Nm(t,{0:()=>e.matches(Um),1(){let t=e;for(;null!==t;){if(t.matches(Um))return!0;t=t.parentElement}return!1}})}function Zm(e){let t=Bm(e);jn((()=>{t&&!Wm(t.activeElement,0)&&Ym(e)}))}var Km=(e=>(e[e.Keyboard=0]="Keyboard",e[e.Mouse=1]="Mouse",e))(Km||{});function Ym(e){null==e||e.focus({preventScroll:!0})}"undefined"!=typeof window&&"undefined"!=typeof document&&(document.addEventListener("keydown",(e=>{e.metaKey||e.altKey||e.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")}),!0),document.addEventListener("click",(e=>{1===e.detail?delete document.documentElement.dataset.headlessuiFocusVisible:0===e.detail&&(document.documentElement.dataset.headlessuiFocusVisible="")}),!0));let Gm=["textarea","input"].join(",");function Jm(e,t=e=>e){return e.slice().sort(((e,n)=>{let r=t(e),o=t(n);if(null===r||null===o)return 0;let i=r.compareDocumentPosition(o);return i&Node.DOCUMENT_POSITION_FOLLOWING?-1:i&Node.DOCUMENT_POSITION_PRECEDING?1:0}))}function Qm(e,t,{sorted:n=!0,relativeTo:r=null,skipElements:o=[]}={}){var i;let s=null!=(i=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:null==e?void 0:e.ownerDocument)?i:document,a=Array.isArray(e)?n?Jm(e):e:qm(e);o.length>0&&a.length>1&&(a=a.filter((e=>!o.includes(e)))),r=null!=r?r:s.activeElement;let l,u=(()=>{if(5&t)return 1;if(10&t)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),c=(()=>{if(1&t)return 0;if(2&t)return Math.max(0,a.indexOf(r))-1;if(4&t)return Math.max(0,a.indexOf(r))+1;if(8&t)return a.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),f=32&t?{preventScroll:!0}:{},d=0,p=a.length;do{if(d>=p||d+p<=0)return 0;let e=c+d;if(16&t)e=(e+p)%p;else{if(e<0)return 3;if(e>=p)return 1}l=a[e],null==l||l.focus(f),d+=u}while(l!==s.activeElement);return 6&t&&function(e){var t,n;return null!=(n=null==(t=null==e?void 0:e.matches)?void 0:t.call(e,Gm))&&n}(l)&&l.select(),2}function Xm(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function ey(){return Xm()||/Android/gi.test(window.navigator.userAgent)}function ty(e,t,n){Dm.isServer||Ii((r=>{document.addEventListener(e,t,n),r((()=>document.removeEventListener(e,t,n)))}))}function ny(e,t,n){Dm.isServer||Ii((r=>{window.addEventListener(e,t,n),r((()=>window.removeEventListener(e,t,n)))}))}function ry(e,t,n=fa((()=>!0))){function r(r,o){if(!n.value||r.defaultPrevented)return;let i=o(r);if(null===i||!i.getRootNode().contains(i))return;let s=function e(t){return"function"==typeof t?e(t()):Array.isArray(t)||t instanceof Set?t:[t]}(e);for(let e of s){if(null===e)continue;let t=e instanceof HTMLElement?e:jm(e);if(null!=t&&t.contains(i)||r.composed&&r.composedPath().includes(t))return}return!Wm(i,zm.Loose)&&-1!==i.tabIndex&&r.preventDefault(),t(r,i)}let o=Yt(null);ty("pointerdown",(e=>{var t,r;n.value&&(o.value=(null==(r=null==(t=e.composedPath)?void 0:t.call(e))?void 0:r[0])||e.target)}),!0),ty("mousedown",(e=>{var t,r;n.value&&(o.value=(null==(r=null==(t=e.composedPath)?void 0:t.call(e))?void 0:r[0])||e.target)}),!0),ty("click",(e=>{ey()||o.value&&(r(e,(()=>o.value)),o.value=null)}),!0),ty("touchend",(e=>r(e,(()=>e.target instanceof HTMLElement?e.target:null))),!0),ny("blur",(e=>r(e,(()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null))),!0)}function oy(e,t){if(e)return e;let n=null!=t?t:"button";return"string"==typeof n&&"button"===n.toLowerCase()?"button":void 0}function iy(e,t){let n=Yt(oy(e.value.type,e.value.as));return Pr((()=>{n.value=oy(e.value.type,e.value.as)})),Ii((()=>{var e;n.value||jm(t)&&jm(t)instanceof HTMLButtonElement&&(null==(e=jm(t))||!e.hasAttribute("type"))&&(n.value="button")})),n}let sy=/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g;function ay(e){var t,n;let r=null!=(t=e.innerText)?t:"",o=e.cloneNode(!0);if(!(o instanceof HTMLElement))return r;let i=!1;for(let e of o.querySelectorAll('[hidden],[aria-hidden],[role="img"]'))e.remove(),i=!0;let s=i?null!=(n=o.innerText)?n:"":r;return sy.test(s)&&(s=s.replace(sy,"")),s}function ly(e){let t=Yt(""),n=Yt("");return()=>{let r=jm(e);if(!r)return"";let o=r.innerText;if(t.value===o)return n.value;let i=function(e){let t=e.getAttribute("aria-label");if("string"==typeof t)return t.trim();let n=e.getAttribute("aria-labelledby");if(n){let e=n.split(" ").map((e=>{let t=document.getElementById(e);if(t){let e=t.getAttribute("aria-label");return"string"==typeof e?e.trim():ay(t).trim()}return null})).filter(Boolean);if(e.length>0)return e.join(", ")}return ay(e).trim()}(r).trim().toLowerCase();return t.value=o,n.value=i,i}}function uy(e){return[e.screenX,e.screenY]}function cy(){let e=Yt([-1,-1]);return{wasMoved(t){let n=uy(t);return(e.value[0]!==n[0]||e.value[1]!==n[1])&&(e.value=n,!0)},update(t){e.value=uy(t)}}}let fy=Symbol("Context");var dy=(e=>(e[e.Open=1]="Open",e[e.Closed=2]="Closed",e[e.Closing=4]="Closing",e[e.Opening=8]="Opening",e))(dy||{});function py(){return Fo(fy,null)}function hy(e){Mo(fy,e)}var vy=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(vy||{});var gy=(e=>(e[e.First=0]="First",e[e.Previous=1]="Previous",e[e.Next=2]="Next",e[e.Last=3]="Last",e[e.Specific=4]="Specific",e[e.Nothing=5]="Nothing",e))(gy||{});function my(e,t){let n=t.resolveItems();if(n.length<=0)return null;let r=t.resolveActiveIndex(),o=null!=r?r:-1;switch(e.focus){case 0:for(let e=0;e=0;--e)if(!t.resolveDisabled(n[e],e,n))return e;return r;case 2:for(let e=o+1;e=0;--e)if(!t.resolveDisabled(n[e],e,n))return e;return r;case 4:for(let r=0;r(e[e.None=0]="None",e[e.RenderStrategy=1]="RenderStrategy",e[e.Static=2]="Static",e))(yy||{}),by=(e=>(e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden",e))(by||{});function wy({visible:e=!0,features:t=0,ourProps:n,theirProps:r,...o}){var i;let s=xy(r,n),a=Object.assign(o,{props:s});if(e||2&t&&s.static)return Cy(a);if(1&t){return Nm(null==(i=s.unmount)||i?0:1,{0:()=>null,1:()=>Cy({...o,props:{...s,hidden:!0,style:{display:"none"}}})})}return Cy(a)}function Cy({props:e,attrs:t,slots:n,slot:r,name:o}){var i,s;let{as:a,...l}=Sy(e,["unmount","static"]),u=null==(i=n.default)?void 0:i.call(n,r),c={};if(r){let e=!1,t=[];for(let[n,o]of Object.entries(r))"boolean"==typeof o&&(e=!0),!0===o&&t.push(n);e&&(c["data-headlessui-state"]=t.join(" "))}if("template"===a){if(u=_y(null!=u?u:[]),Object.keys(l).length>0||Object.keys(t).length>0){let[e,...n]=null!=u?u:[];if(!function(e){return null!=e&&("string"==typeof e.type||"object"==typeof e.type||"function"==typeof e.type)}(e)||n.length>0)throw new Error(['Passing props on "template"!',"",`The current component <${o} /> is rendering a "template".`,"However we need to passthrough the following props:",Object.keys(l).concat(Object.keys(t)).map((e=>e.trim())).filter(((e,t,n)=>n.indexOf(e)===t)).sort(((e,t)=>e.localeCompare(t))).map((e=>` - ${e}`)).join("\n"),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "template".',"Render a single element as the child so that we can forward the props onto that element."].map((e=>` - ${e}`)).join("\n")].join("\n"));let r=xy(null!=(s=e.props)?s:{},l,c),i=Ls(e,r,!0);for(let e in r)e.startsWith("on")&&(i.props||(i.props={}),i.props[e]=r[e]);return i}return Array.isArray(u)&&1===u.length?u[0]:u}return da(a,Object.assign({},l,c),{default:()=>u})}function _y(e){return e.flatMap((e=>e.type===as?_y(e.children):[e]))}function xy(...e){if(0===e.length)return{};if(1===e.length)return e[0];let t={},n={};for(let r of e)for(let e in r)e.startsWith("on")&&"function"==typeof r[e]?(null!=n[e]||(n[e]=[]),n[e].push(r[e])):t[e]=r[e];if(t.disabled||t["aria-disabled"])return Object.assign(t,Object.fromEntries(Object.keys(n).map((e=>[e,void 0]))));for(let e in n)Object.assign(t,{[e](t,...r){let o=n[e];for(let e of o){if(t instanceof Event&&t.defaultPrevented)return;e(t,...r)}}});return t}function Sy(e,t=[]){let n=Object.assign({},e);for(let e of t)e in n&&delete n[e];return n}var ky=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(ky||{}),Oy=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(Oy||{});let Ey=Symbol("MenuContext");function Ty(e){let t=Fo(Ey,null);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Ty),t}return t}let Ay=hr({name:"Menu",props:{as:{type:[Object,String],default:"template"}},setup(e,{slots:t,attrs:n}){let r=Yt(1),o=Yt(null),i=Yt(null),s=Yt([]),a=Yt(""),l=Yt(null),u=Yt(1);function c(e=e=>e){let t=null!==l.value?s.value[l.value]:null,n=Jm(e(s.value.slice()),(e=>jm(e.dataRef.domRef))),r=t?n.indexOf(t):null;return-1===r&&(r=null),{items:n,activeItemIndex:r}}let f={menuState:r,buttonRef:o,itemsRef:i,items:s,searchQuery:a,activeItemIndex:l,activationTrigger:u,closeMenu:()=>{r.value=1,l.value=null},openMenu:()=>r.value=0,goToItem(e,t,n){let r=c(),o=my(e===gy.Specific?{focus:gy.Specific,id:t}:{focus:e},{resolveItems:()=>r.items,resolveActiveIndex:()=>r.activeItemIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.disabled});a.value="",l.value=o,u.value=null!=n?n:1,s.value=r.items},search(e){let t=""!==a.value?0:1;a.value+=e.toLowerCase();let n=(null!==l.value?s.value.slice(l.value+t).concat(s.value.slice(0,l.value+t)):s.value).find((e=>e.dataRef.textValue.startsWith(a.value)&&!e.dataRef.disabled)),r=n?s.value.indexOf(n):-1;-1===r||r===l.value||(l.value=r,u.value=1)},clearSearch(){a.value=""},registerItem(e,t){let n=c((n=>[...n,{id:e,dataRef:t}]));s.value=n.items,l.value=n.activeItemIndex,u.value=1},unregisterItem(e){let t=c((t=>{let n=t.findIndex((t=>t.id===e));return-1!==n&&t.splice(n,1),t}));s.value=t.items,l.value=t.activeItemIndex,u.value=1}};return ry([o,i],((e,t)=>{var n;f.closeMenu(),Wm(t,zm.Loose)||(e.preventDefault(),null==(n=jm(o))||n.focus())}),fa((()=>0===r.value))),Mo(Ey,f),hy(fa((()=>Nm(r.value,{0:dy.Open,1:dy.Closed})))),()=>{let o={open:0===r.value,close:f.closeMenu};return wy({ourProps:{},theirProps:e,slot:o,slots:t,attrs:n,name:"Menu"})}}}),Ly=hr({name:"MenuButton",props:{disabled:{type:Boolean,default:!1},as:{type:[Object,String],default:"button"},id:{type:String,default:null}},setup(e,{attrs:t,slots:n,expose:r}){var o;let i=null!=(o=e.id)?o:`headlessui-menu-button-${Im()}`,s=Ty("MenuButton");function a(e){switch(e.key){case vy.Space:case vy.Enter:case vy.ArrowDown:e.preventDefault(),e.stopPropagation(),s.openMenu(),jn((()=>{var e;null==(e=jm(s.itemsRef))||e.focus({preventScroll:!0}),s.goToItem(gy.First)}));break;case vy.ArrowUp:e.preventDefault(),e.stopPropagation(),s.openMenu(),jn((()=>{var e;null==(e=jm(s.itemsRef))||e.focus({preventScroll:!0}),s.goToItem(gy.Last)}))}}function l(e){if(e.key===vy.Space)e.preventDefault()}function u(t){e.disabled||(0===s.menuState.value?(s.closeMenu(),jn((()=>{var e;return null==(e=jm(s.buttonRef))?void 0:e.focus({preventScroll:!0})}))):(t.preventDefault(),s.openMenu(),function(e){requestAnimationFrame((()=>requestAnimationFrame(e)))}((()=>{var e;return null==(e=jm(s.itemsRef))?void 0:e.focus({preventScroll:!0})}))))}r({el:s.buttonRef,$el:s.buttonRef});let c=iy(fa((()=>({as:e.as,type:t.type}))),s.buttonRef);return()=>{var r;let o={open:0===s.menuState.value},{...f}=e;return wy({ourProps:{ref:s.buttonRef,id:i,type:c.value,"aria-haspopup":"menu","aria-controls":null==(r=jm(s.itemsRef))?void 0:r.id,"aria-expanded":0===s.menuState.value,onKeydown:a,onKeyup:l,onClick:u},theirProps:f,slot:o,attrs:t,slots:n,name:"MenuButton"})}}}),Py=hr({name:"MenuItems",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(e,{attrs:t,slots:n,expose:r}){var o;let i=null!=(o=e.id)?o:`headlessui-menu-items-${Im()}`,s=Ty("MenuItems"),a=Yt(null);function l(e){var t;switch(a.value&&clearTimeout(a.value),e.key){case vy.Space:if(""!==s.searchQuery.value)return e.preventDefault(),e.stopPropagation(),s.search(e.key);case vy.Enter:if(e.preventDefault(),e.stopPropagation(),null!==s.activeItemIndex.value){null==(t=jm(s.items.value[s.activeItemIndex.value].dataRef.domRef))||t.click()}s.closeMenu(),Zm(jm(s.buttonRef));break;case vy.ArrowDown:return e.preventDefault(),e.stopPropagation(),s.goToItem(gy.Next);case vy.ArrowUp:return e.preventDefault(),e.stopPropagation(),s.goToItem(gy.Previous);case vy.Home:case vy.PageUp:return e.preventDefault(),e.stopPropagation(),s.goToItem(gy.First);case vy.End:case vy.PageDown:return e.preventDefault(),e.stopPropagation(),s.goToItem(gy.Last);case vy.Escape:e.preventDefault(),e.stopPropagation(),s.closeMenu(),jn((()=>{var e;return null==(e=jm(s.buttonRef))?void 0:e.focus({preventScroll:!0})}));break;case vy.Tab:e.preventDefault(),e.stopPropagation(),s.closeMenu(),jn((()=>function(e,t){return Qm(qm(),t,{relativeTo:e})}(jm(s.buttonRef),e.shiftKey?Vm.Previous:Vm.Next)));break;default:1===e.key.length&&(s.search(e.key),a.value=setTimeout((()=>s.clearSearch()),350))}}function u(e){if(e.key===vy.Space)e.preventDefault()}r({el:s.itemsRef,$el:s.itemsRef}),function({container:e,accept:t,walk:n,enabled:r}){Ii((()=>{let o=e.value;if(!o||void 0!==r&&!r.value)return;let i=Bm(e);if(!i)return;let s=Object.assign((e=>t(e)),{acceptNode:t}),a=i.createTreeWalker(o,NodeFilter.SHOW_ELEMENT,s,!1);for(;a.nextNode();)n(a.currentNode)}))}({container:fa((()=>jm(s.itemsRef))),enabled:fa((()=>0===s.menuState.value)),accept:e=>"menuitem"===e.getAttribute("role")?NodeFilter.FILTER_REJECT:e.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT,walk(e){e.setAttribute("role","none")}});let c=py(),f=fa((()=>null!==c?(c.value&dy.Open)===dy.Open:0===s.menuState.value));return()=>{var r,o;let a={open:0===s.menuState.value},{...c}=e;return wy({ourProps:{"aria-activedescendant":null===s.activeItemIndex.value||null==(r=s.items.value[s.activeItemIndex.value])?void 0:r.id,"aria-labelledby":null==(o=jm(s.buttonRef))?void 0:o.id,id:i,onKeydown:l,onKeyup:u,role:"menu",tabIndex:0,ref:s.itemsRef},theirProps:c,slot:a,attrs:t,slots:n,features:yy.RenderStrategy|yy.Static,visible:f.value,name:"MenuItems"})}}}),Ry=hr({name:"MenuItem",inheritAttrs:!1,props:{as:{type:[Object,String],default:"template"},disabled:{type:Boolean,default:!1},id:{type:String,default:null}},setup(e,{slots:t,attrs:n,expose:r}){var o;let i=null!=(o=e.id)?o:`headlessui-menu-item-${Im()}`,s=Ty("MenuItem"),a=Yt(null);r({el:a,$el:a});let l=fa((()=>null!==s.activeItemIndex.value&&s.items.value[s.activeItemIndex.value].id===i)),u=ly(a),c=fa((()=>({disabled:e.disabled,get textValue(){return u()},domRef:a})));function f(t){if(e.disabled)return t.preventDefault();s.closeMenu(),Zm(jm(s.buttonRef))}function d(){if(e.disabled)return s.goToItem(gy.Nothing);s.goToItem(gy.Specific,i)}Pr((()=>s.registerItem(i,c))),Nr((()=>s.unregisterItem(i))),Ii((()=>{0===s.menuState.value&&l.value&&0!==s.activationTrigger.value&&jn((()=>{var e,t;return null==(t=null==(e=jm(a))?void 0:e.scrollIntoView)?void 0:t.call(e,{block:"nearest"})}))}));let p=cy();function h(e){p.update(e)}function v(t){p.wasMoved(t)&&(e.disabled||l.value||s.goToItem(gy.Specific,i,0))}function g(t){p.wasMoved(t)&&(e.disabled||l.value&&s.goToItem(gy.Nothing))}return()=>{let{disabled:r,...o}=e,u={active:l.value,disabled:r,close:s.closeMenu};return wy({ourProps:{id:i,ref:a,role:"menuitem",tabIndex:!0===r?void 0:-1,"aria-disabled":!0===r||void 0,onClick:f,onFocus:d,onPointerenter:h,onMouseenter:h,onPointermove:v,onMousemove:v,onPointerleave:g,onMouseleave:g},theirProps:{...n,...o},slot:u,attrs:n,slots:t,name:"MenuItem"})}}});function Iy(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M6 18 18 6M6 6l12 12"})])}function jy(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M10.5 19.5 3 12m0 0 7.5-7.5M3 12h18"})])}function Ny(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"})])}function My(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"})])}function Fy(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M2.25 12.75V12A2.25 2.25 0 0 1 4.5 9.75h15A2.25 2.25 0 0 1 21.75 12v.75m-8.69-6.44-2.12-2.12a1.5 1.5 0 0 0-1.061-.44H4.5A2.25 2.25 0 0 0 2.25 6v12a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18V9a2.25 2.25 0 0 0-2.25-2.25h-5.379a1.5 1.5 0 0 1-1.06-.44Z"})])}function Dy(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 0 0-1.883 2.542l.857 6a2.25 2.25 0 0 0 2.227 1.932H19.05a2.25 2.25 0 0 0 2.227-1.932l.857-6a2.25 2.25 0 0 0-1.883-2.542m-16.5 0V6A2.25 2.25 0 0 1 6 3.75h3.879a1.5 1.5 0 0 1 1.06.44l2.122 2.12a1.5 1.5 0 0 0 1.06.44H18A2.25 2.25 0 0 1 20.25 9v.776"})])}function By(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m8.25 4.5 7.5 7.5-7.5 7.5"})])}function Uy(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 6.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 12.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 18.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Z"})])}function Vy(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125"})])}function Hy(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"})])}var $y=Pp({id:"hosts",state:function(){return{selectedHostIdentifier:null}},getters:{supportsHosts:function(){return LogViewer.supports_hosts},hosts:function(){return LogViewer.hosts||[]},hasRemoteHosts:function(){return this.hosts.some((function(e){return e.is_remote}))},selectedHost:function(){var e=this;return this.hosts.find((function(t){return t.identifier===e.selectedHostIdentifier}))},localHost:function(){return this.hosts.find((function(e){return!e.is_remote}))},hostQueryParam:function(){return this.selectedHost&&this.selectedHost.is_remote?this.selectedHost.identifier:void 0}},actions:{selectHost:function(e){var t;this.supportsHosts||(e=null),"string"==typeof e&&(e=this.hosts.find((function(t){return t.identifier===e}))),e||(e=this.hosts.find((function(e){return!e.is_remote}))),this.selectedHostIdentifier=(null===(t=e)||void 0===t?void 0:t.identifier)||null}}});var qy;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;const zy="undefined"!=typeof window,Wy=(Object.prototype.toString,e=>"function"==typeof e),Zy=e=>"string"==typeof e,Ky=()=>{};zy&&(null==(qy=null==window?void 0:window.navigator)?void 0:qy.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function Yy(e){return"function"==typeof e?e():en(e)}function Gy(e,t){return function(...n){return new Promise(((r,o)=>{Promise.resolve(e((()=>t.apply(this,n)),{fn:t,thisArg:this,args:n})).then(r).catch(o)}))}}const Jy=e=>e();function Qy(e){return!!_e()&&(xe(e),!0)}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var Xy=Object.getOwnPropertySymbols,eb=Object.prototype.hasOwnProperty,tb=Object.prototype.propertyIsEnumerable,nb=(e,t)=>{var n={};for(var r in e)eb.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&Xy)for(var r of Xy(e))t.indexOf(r)<0&&tb.call(e,r)&&(n[r]=e[r]);return n};function rb(e,t,n={}){const r=n,{eventFilter:o=Jy}=r,i=nb(r,["eventFilter"]);return Fi(e,Gy(o,t),i)}Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var ob=Object.defineProperty,ib=Object.defineProperties,sb=Object.getOwnPropertyDescriptors,ab=Object.getOwnPropertySymbols,lb=Object.prototype.hasOwnProperty,ub=Object.prototype.propertyIsEnumerable,cb=(e,t,n)=>t in e?ob(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,fb=(e,t)=>{for(var n in t||(t={}))lb.call(t,n)&&cb(e,n,t[n]);if(ab)for(var n of ab(t))ub.call(t,n)&&cb(e,n,t[n]);return e},db=(e,t)=>ib(e,sb(t)),pb=(e,t)=>{var n={};for(var r in e)lb.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&ab)for(var r of ab(e))t.indexOf(r)<0&&ub.call(e,r)&&(n[r]=e[r]);return n};function hb(e,t,n={}){const r=n,{eventFilter:o}=r,i=pb(r,["eventFilter"]),{eventFilter:s,pause:a,resume:l,isActive:u}=function(e=Jy){const t=Yt(!0);return{isActive:It(t),pause:function(){t.value=!1},resume:function(){t.value=!0},eventFilter:(...n)=>{t.value&&e(...n)}}}(o);return{stop:rb(e,t,db(fb({},i),{eventFilter:s})),pause:a,resume:l,isActive:u}}Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;function vb(e){var t;const n=Yy(e);return null!=(t=null==n?void 0:n.$el)?t:n}const gb=zy?window:void 0;zy&&window.document,zy&&window.navigator,zy&&window.location;function mb(...e){let t,n,r,o;if(Zy(e[0])||Array.isArray(e[0])?([n,r,o]=e,t=gb):[t,n,r,o]=e,!t)return Ky;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const i=[],s=()=>{i.forEach((e=>e())),i.length=0},a=Fi((()=>[vb(t),Yy(o)]),(([e,t])=>{s(),e&&i.push(...n.flatMap((n=>r.map((r=>((e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)))(e,n,r,t))))))}),{immediate:!0,flush:"post"}),l=()=>{a(),s()};return Qy(l),l}Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;const yb="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},bb="__vueuse_ssr_handlers__";yb[bb]=yb[bb]||{};const wb=yb[bb];function Cb(e,t){return wb[e]||t}function _b(e){return null==e?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":"boolean"==typeof e?"boolean":"string"==typeof e?"string":"object"==typeof e?"object":Number.isNaN(e)?"any":"number"}var xb=Object.defineProperty,Sb=Object.getOwnPropertySymbols,kb=Object.prototype.hasOwnProperty,Ob=Object.prototype.propertyIsEnumerable,Eb=(e,t,n)=>t in e?xb(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Tb=(e,t)=>{for(var n in t||(t={}))kb.call(t,n)&&Eb(e,n,t[n]);if(Sb)for(var n of Sb(t))Ob.call(t,n)&&Eb(e,n,t[n]);return e};const Ab={boolean:{read:e=>"true"===e,write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Lb="vueuse-storage";function Pb(e,t,n,r={}){var o;const{flush:i="pre",deep:s=!0,listenToStorageChanges:a=!0,writeDefaults:l=!0,mergeDefaults:u=!1,shallow:c,window:f=gb,eventFilter:d,onError:p=e=>{}}=r,h=(c?Gt:Yt)(t);if(!n)try{n=Cb("getDefaultStorage",(()=>{var e;return null==(e=gb)?void 0:e.localStorage}))()}catch(e){p(e)}if(!n)return h;const v=Yy(t),g=_b(v),m=null!=(o=r.serializer)?o:Ab[g],{pause:y,resume:b}=hb(h,(()=>function(t){try{if(null==t)n.removeItem(e);else{const r=m.write(t),o=n.getItem(e);o!==r&&(n.setItem(e,r),f&&f.dispatchEvent(new CustomEvent(Lb,{detail:{key:e,oldValue:o,newValue:r,storageArea:n}})))}}catch(e){p(e)}}(h.value)),{flush:i,deep:s,eventFilter:d});return f&&a&&(mb(f,"storage",w),mb(f,Lb,(function(e){w(e.detail)}))),w(),h;function w(t){if(!t||t.storageArea===n)if(t&&null==t.key)h.value=v;else if(!t||t.key===e){y();try{h.value=function(t){const r=t?t.newValue:n.getItem(e);if(null==r)return l&&null!==v&&n.setItem(e,m.write(v)),v;if(!t&&u){const e=m.read(r);return Wy(u)?u(e,v):"object"!==g||Array.isArray(e)?e:Tb(Tb({},v),e)}return"string"!=typeof r?r:m.read(r)}(t)}catch(e){p(e)}finally{t?jn(b):b()}}}}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;new Map;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;function Rb(e,t,n={}){const{window:r=gb}=n;return Pb(e,t,null==r?void 0:r.localStorage,n)}Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var Ib,jb;(jb=Ib||(Ib={})).UP="UP",jb.RIGHT="RIGHT",jb.DOWN="DOWN",jb.LEFT="LEFT",jb.NONE="NONE";Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var Nb=Object.defineProperty,Mb=Object.getOwnPropertySymbols,Fb=Object.prototype.hasOwnProperty,Db=Object.prototype.propertyIsEnumerable,Bb=(e,t,n)=>t in e?Nb(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;((e,t)=>{for(var n in t||(t={}))Fb.call(t,n)&&Bb(e,n,t[n]);if(Mb)for(var n of Mb(t))Db.call(t,n)&&Bb(e,n,t[n])})({linear:function(e){return e}},{easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]});var Ub=Pp({id:"search",state:function(){return{query:"",searchMoreRoute:null,searching:!1,percentScanned:0,error:null}},getters:{hasQuery:function(e){return""!==String(e.query).trim()}},actions:{init:function(){this.checkSearchProgress()},setQuery:function(e){this.query=e},update:function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;this.query=e,this.error=t&&""!==t?t:null,this.searchMoreRoute=n,this.searching=r,this.percentScanned=o,this.searching&&this.checkSearchProgress()},checkSearchProgress:function(){var e=this,t=this.query;if(""!==t){var n="?"+new URLSearchParams({query:t});Qv.get(this.searchMoreRoute+n).then((function(n){var r=n.data;if(e.query===t){var o=e.searching;e.searching=r.hasMoreResults,e.percentScanned=r.percentScanned,e.searching?e.checkSearchProgress():o&&!e.searching&&window.dispatchEvent(new CustomEvent("reload-results"))}}))}}}}),Vb=Pp({id:"pagination",state:function(){return{page:1,pagination:{}}},getters:{currentPage:function(e){return 1!==e.page?Number(e.page):null},links:function(e){var t;return((null===(t=e.pagination)||void 0===t?void 0:t.links)||[]).slice(1,-1)},linksShort:function(e){var t;return((null===(t=e.pagination)||void 0===t?void 0:t.links_short)||[]).slice(1,-1)},hasPages:function(e){var t;return(null===(t=e.pagination)||void 0===t?void 0:t.last_page)>1},hasMorePages:function(e){var t;return null!==(null===(t=e.pagination)||void 0===t?void 0:t.next_page_url)}},actions:{setPagination:function(e){var t,n;(this.pagination=e,(null===(t=this.pagination)||void 0===t?void 0:t.last_page)0}))},totalResults:function(){return this.levelsFound.reduce((function(e,t){return e+t.count}),0)},levelsSelected:function(){return this.levelsFound.filter((function(e){return e.selected}))},totalResultsSelected:function(){return this.levelsSelected.reduce((function(e,t){return e+t.count}),0)}},actions:{setLevelCounts:function(e){e.hasOwnProperty("length")?this.levelCounts=e:this.levelCounts=Object.values(e),this.allLevels=e.map((function(e){return e.level}))},selectAllLevels:function(){this.excludedLevels=[],this.levelCounts.forEach((function(e){return e.selected=!0}))},deselectAllLevels:function(){this.excludedLevels=this.allLevels,this.levelCounts.forEach((function(e){return e.selected=!1}))},toggleLevel:function(e){var t=this.levelCounts.find((function(t){return t.level===e}))||{};this.excludedLevels.includes(e)?(this.excludedLevels=this.excludedLevels.filter((function(t){return t!==e})),t.selected=!0):(this.excludedLevels.push(e),t.selected=!1)}}}),$b=n(543),qb={System:"System",Light:"Light",Dark:"Dark"},zb=[{label:"Datetime",data_key:"datetime"},{label:"Severity",data_key:"level"},{label:"Message",data_key:"message"}],Wb=Pp({id:"logViewer",state:function(){return{theme:Rb("logViewerTheme",qb.System),shorterStackTraces:Rb("logViewerShorterStackTraces",!1),direction:Rb("logViewerDirection","desc"),resultsPerPage:Rb("logViewerResultsPerPage",25),helpSlideOverOpen:!1,loading:!1,error:null,logs:[],columns:zb,levelCounts:[],performance:{},hasMoreResults:!1,percentScanned:100,abortController:null,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,stacksOpen:[],stacksInView:[],stackTops:{},containerTop:0,showLevelsDropdown:!0}},getters:{selectedFile:function(){return Xb().selectedFile},isOpen:function(e){return function(t){return e.stacksOpen.includes(t)}},isMobile:function(e){return e.viewportWidth<=1023},tableRowHeight:function(){return this.isMobile?29:36},headerHeight:function(){return this.isMobile?0:36},shouldBeSticky:function(e){var t=this;return function(n){return t.isOpen(n)&&e.stacksInView.includes(n)}},stickTopPosition:function(){var e=this;return function(t){var n=e.pixelsAboveFold(t);return n<0?Math.max(e.headerHeight-e.tableRowHeight,e.headerHeight+n)+"px":e.headerHeight+"px"}},pixelsAboveFold:function(e){var t=this;return function(n){var r=document.getElementById("tbody-"+n);if(!r)return!1;var o=r.getClientRects()[0];return o.top+o.height-t.tableRowHeight-t.headerHeight-e.containerTop}},isInViewport:function(){var e=this;return function(t){return e.pixelsAboveFold(t)>-e.tableRowHeight}}},actions:{setViewportDimensions:function(e,t){this.viewportWidth=e,this.viewportHeight=t;var n=document.querySelector(".log-item-container");n&&(this.containerTop=n.getBoundingClientRect().top)},toggleTheme:function(){switch(this.theme){case qb.System:this.theme=qb.Light;break;case qb.Light:this.theme=qb.Dark;break;default:this.theme=qb.System}this.syncTheme()},syncTheme:function(){var e=this.theme;e===qb.Dark||e===qb.System&&window.matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")},toggle:function(e){this.isOpen(e)?this.stacksOpen=this.stacksOpen.filter((function(t){return t!==e})):this.stacksOpen.push(e),this.onScroll()},onScroll:function(){var e=this;this.stacksOpen.forEach((function(t){e.isInViewport(t)?(e.stacksInView.includes(t)||e.stacksInView.push(t),e.stackTops[t]=e.stickTopPosition(t)):(e.stacksInView=e.stacksInView.filter((function(e){return e!==t})),delete e.stackTops[t])}))},reset:function(){this.stacksOpen=[],this.stacksInView=[],this.stackTops={};var e=document.querySelector(".log-item-container");e&&(this.containerTop=e.getBoundingClientRect().top,e.scrollTo(0,0))},loadLogs:(0,$b.debounce)((function(){var e,t=this,n=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).silently,r=void 0!==n&&n,o=$y(),i=Xb(),s=Ub(),a=Vb(),l=Hb();if(0!==i.folders.length&&(this.abortController&&this.abortController.abort(),this.selectedFile||s.hasQuery)){this.abortController=new AbortController;var u={host:o.hostQueryParam,file:null===(e=this.selectedFile)||void 0===e?void 0:e.identifier,direction:this.direction,query:s.query,page:a.currentPage,per_page:this.resultsPerPage,exclude_levels:Ut(l.excludedLevels),exclude_file_types:Ut(i.fileTypesExcluded),shorter_stack_traces:this.shorterStackTraces};r||(this.loading=!0),Qv.get("".concat(LogViewer.basePath,"/api/logs"),{params:u,signal:this.abortController.signal}).then((function(e){var n=e.data;t.logs=u.host?n.logs.map((function(e){var t={host:u.host,file:e.file_identifier,query:"log-index:".concat(e.index)};return e.url="".concat(window.location.host).concat(LogViewer.basePath,"?").concat(new URLSearchParams(t)),e})):n.logs,t.columns=n.columns||zb,t.hasMoreResults=n.hasMoreResults,t.percentScanned=n.percentScanned,t.error=n.error||null,t.performance=n.performance||{},l.setLevelCounts(n.levelCounts),a.setPagination(n.pagination),t.loading=!1,r?document.dispatchEvent(new Event("logsPageLoadedSilently")):jn((function(){document.dispatchEvent(new Event("logsPageLoaded")),t.reset(),n.expandAutomatically&&t.stacksOpen.push(0)})),t.hasMoreResults&&t.loadLogs({silently:!0})})).catch((function(e){var n;if("ERR_CANCELED"===e.code)return t.hasMoreResults=!1,void(t.percentScanned=100);t.loading=!1,t.error=e.message,null!==(n=e.response)&&void 0!==n&&null!==(n=n.data)&&void 0!==n&&n.message&&(t.error+=": "+e.response.data.message)}))}}),10)}});function Zb(e){return Zb="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Zb(e)}function Kb(e){return function(e){if(Array.isArray(e))return Yb(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return Yb(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Yb(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Yb(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0}))},files:function(e){return e.folders.flatMap((function(e){return e.files}))},selectedFile:function(e){return e.files.find((function(t){return t.identifier===e.selectedFileIdentifier}))},foldersOpen:function(e){return e.openFolderIdentifiers.map((function(t){return e.folders.find((function(e){return e.identifier===t}))}))},isOpen:function(){var e=this;return function(t){return e.foldersOpen.map((function(e){return e.identifier})).includes(t.identifier)}},isChecked:function(e){return function(t){return e.filesChecked.includes("string"==typeof t?t:t.identifier)}},shouldBeSticky:function(e){var t=this;return function(n){return t.isOpen(n)&&e.foldersInView.map((function(e){return e.identifier})).includes(n.identifier)}},isInViewport:function(){var e=this;return function(t){return e.pixelsAboveFold(t)>-36}},pixelsAboveFold:function(e){return function(t){var n=document.getElementById("folder-"+t);if(!n)return!1;var r=n.getClientRects()[0];return r.top+r.height-e.containerTop}},hasFilesChecked:function(e){return e.filesChecked.length>0},fileTypesSelected:function(e){return e.fileTypesAvailable.filter((function(t){return e.selectedFileTypes.includes(t.identifier)}))},fileTypesExcluded:function(e){return e.fileTypesAvailable.filter((function(t){return!e.selectedFileTypes.includes(t.identifier)})).map((function(e){return e.identifier}))},selectedFileTypesString:function(){var e=this.fileTypesSelected.map((function(e){return e.name}));return 0===e.length?"Please select at least one file type":1===e.length?e[0]:2===e.length?e.join(" and "):3===e.length?e.slice(0,-1).join(", ")+" and "+e.slice(-1):e.slice(0,3).join(", ")+" and "+(e.length-3)+" more"}},actions:{setDirection:function(e){this.direction=e},selectFile:function(e){this.selectedFileIdentifier!==e&&(this.selectedFileIdentifier=e,this.openFolderForActiveFile(),this.sidebarOpen=!1)},openFolderForActiveFile:function(){var e=this;if(this.selectedFile){var t=this.folders.find((function(t){return t.files.some((function(t){return t.identifier===e.selectedFile.identifier}))}));t&&!this.isOpen(t)&&this.toggle(t)}},openRootFolderIfNoneOpen:function(){var e=this.folders.find((function(e){return e.is_root}));e&&0===this.openFolderIdentifiers.length&&this.openFolderIdentifiers.push(e.identifier)},loadFolders:function(){var e=this;return this.abortController&&this.abortController.abort(),this.selectedHost?(this.abortController=new AbortController,this.loading=!0,Qv.get("".concat(LogViewer.basePath,"/api/folders"),{params:{host:this.hostQueryParam,direction:this.direction},signal:this.abortController.signal}).then((function(t){var n=t.data;e.folders=n,e.error=n.error||null,e.loading=!1,0===e.openFolderIdentifiers.length&&(e.openFolderForActiveFile(),e.openRootFolderIfNoneOpen()),e.setAvailableFileTypes(n),e.onScroll()})).catch((function(t){var n;"ERR_CANCELED"!==t.code&&(e.loading=!1,e.error=t.message,null!==(n=t.response)&&void 0!==n&&null!==(n=n.data)&&void 0!==n&&n.message&&(e.error+=": "+t.response.data.message))}))):(this.folders=[],this.error=null,void(this.loading=!1))},setAvailableFileTypes:function(e){var t=e.flatMap((function(e){return e.files.map((function(e){return e.type}))})),n=Kb(new Set(t.map((function(e){return e.value}))));this.fileTypesAvailable=n.map((function(e){return{identifier:e,name:t.find((function(t){return t.value===e})).name,count:t.filter((function(t){return t.value===e})).length}})),this.selectedFileTypes&&0!==this.selectedFileTypes.length||(this.selectedFileTypes=n)},toggle:function(e){this.isOpen(e)?this.openFolderIdentifiers=this.openFolderIdentifiers.filter((function(t){return t!==e.identifier})):this.openFolderIdentifiers.push(e.identifier),this.onScroll()},onScroll:function(){var e=this;this.foldersOpen.forEach((function(t){e.isInViewport(t)?e.foldersInView.includes(t)||e.foldersInView.push(t):e.foldersInView=e.foldersInView.filter((function(e){return e!==t}))}))},reset:function(){this.openFolderIdentifiers=[],this.foldersInView=[];var e=document.getElementById("file-list-container");e&&(this.containerTop=e.getBoundingClientRect().top,e.scrollTo(0,0))},toggleSidebar:function(){this.sidebarOpen=!this.sidebarOpen},checkBoxToggle:function(e){this.isChecked(e)?this.filesChecked=this.filesChecked.filter((function(t){return t!==e})):this.filesChecked.push(e)},toggleCheckboxVisibility:function(){this.checkBoxesVisibility=!this.checkBoxesVisibility},resetChecks:function(){this.filesChecked=[],this.checkBoxesVisibility=!1},clearCacheForFile:function(e){var t=this;return this.clearingCache[e.identifier]=!0,Qv.post("".concat(LogViewer.basePath,"/api/files/").concat(e.identifier,"/clear-cache"),{},{params:{host:this.hostQueryParam}}).then((function(){e.identifier===t.selectedFileIdentifier&&Wb().loadLogs(),t.cacheRecentlyCleared[e.identifier]=!0,setTimeout((function(){return t.cacheRecentlyCleared[e.identifier]=!1}),2e3)})).catch((function(e){})).finally((function(){return t.clearingCache[e.identifier]=!1}))},deleteFile:function(e){var t=this;return Qv.delete("".concat(LogViewer.basePath,"/api/files/").concat(e.identifier),{params:{host:this.hostQueryParam}}).then((function(){return t.loadFolders()}))},clearCacheForFolder:function(e){var t=this;return this.clearingCache[e.identifier]=!0,Qv.post("".concat(LogViewer.basePath,"/api/folders/").concat(e.identifier,"/clear-cache"),{},{params:{host:this.hostQueryParam}}).then((function(){e.files.some((function(e){return e.identifier===t.selectedFileIdentifier}))&&Wb().loadLogs(),t.cacheRecentlyCleared[e.identifier]=!0,setTimeout((function(){return t.cacheRecentlyCleared[e.identifier]=!1}),2e3)})).catch((function(e){})).finally((function(){t.clearingCache[e.identifier]=!1}))},deleteFolder:function(e){var t=this;return this.deleting[e.identifier]=!0,Qv.delete("".concat(LogViewer.basePath,"/api/folders/").concat(e.identifier),{params:{host:this.hostQueryParam}}).then((function(){return t.loadFolders()})).catch((function(e){})).finally((function(){t.deleting[e.identifier]=!1}))},deleteSelectedFiles:function(){return Qv.post("".concat(LogViewer.basePath,"/api/delete-multiple-files"),{files:this.filesChecked},{params:{host:this.hostQueryParam}})},clearCacheForAllFiles:function(){var e=this;this.clearingCache["*"]=!0,Qv.post("".concat(LogViewer.basePath,"/api/clear-cache-all"),{},{params:{host:this.hostQueryParam}}).then((function(){e.cacheRecentlyCleared["*"]=!0,setTimeout((function(){return e.cacheRecentlyCleared["*"]=!1}),2e3),Wb().loadLogs()})).catch((function(e){})).finally((function(){return e.clearingCache["*"]=!1}))}}}),ew=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(e=e||"",t)try{e=e.replace(new RegExp(t,"gi"),"$&")}catch(e){}return tw(e).replace(/<mark>/g,"").replace(/<\/mark>/g,"").replace(/<br\/>/g,"
")},tw=function(e){var t={"&":"&","<":"<",">":">",'"':""","'":"'"};return e.replace(/[&<>"']/g,(function(e){return t[e]}))},nw=function(e){var t=document.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.style.position="absolute",t.style.left="-9999px",document.body.appendChild(t);var n=document.getSelection().rangeCount>0&&document.getSelection().getRangeAt(0);t.select(),document.execCommand("copy"),document.body.removeChild(t),n&&(document.getSelection().removeAllRanges(),document.getSelection().addRange(n))},rw=function(e,t,n){var r=e.currentRoute.value,o={host:r.query.host||void 0,file:r.query.file||void 0,query:r.query.query||void 0,page:r.query.page||void 0};"host"===t?(o.file=void 0,o.page=void 0):"file"===t&&void 0!==o.page&&(o.page=void 0),o[t]=n?String(n):void 0,e.push({name:"home",query:o})},ow=function(){var e=Yt({});return{dropdownDirections:e,calculateDropdownDirection:function(t){e.value[t.dataset.toggleId]=function(e){window.innerWidth||document.documentElement.clientWidth;var t=window.innerHeight||document.documentElement.clientHeight;return e.getBoundingClientRect().bottom+1900&&e[0].focus()},vw=function(){var e=Array.from(document.querySelectorAll(".".concat(fw)));e.length>0&&e[e.length-1].focus()},gw=function(e){"true"===e.getAttribute("aria-expanded")||e.click()},mw=function(e){"true"===e.getAttribute("aria-expanded")&&e.click()},yw=function(){var e=document.activeElement,t=xw(e,fw);if(!t){var n=function(){setTimeout((function(){hw(),gw(document.activeElement)}),50),document.removeEventListener("logsPageLoaded",n)};return document.addEventListener("logsPageLoaded",n),void document.dispatchEvent(new Event("goToNextPage"))}mw(e),t.focus(),gw(t)},bw=function(){var e=document.activeElement,t=_w(e,fw);if(!t){var n=function(){setTimeout((function(){vw(),gw(document.activeElement)}),50),document.removeEventListener("logsPageLoaded",n)};return document.addEventListener("logsPageLoaded",n),void document.dispatchEvent(new Event("goToPreviousPage"))}mw(e),t.focus(),gw(t)},ww=function(){var e=xw(document.activeElement,cw);e&&e.focus()},Cw=function(){var e=_w(document.activeElement,cw);e&&e.focus()},_w=function(e,t){for(var n=Array.from(document.querySelectorAll(".".concat(t))),r=n.findIndex((function(t){return t===e}))-1;r>=0&&null===n[r].offsetParent;)r--;return n[r]?n[r]:null},xw=function(e,t){for(var n=Array.from(document.querySelectorAll(".".concat(t))),r=n.findIndex((function(t){return t===e}))+1;rt&&(e.preventDefault(),n[t].focus())}else if("ArrowUp"===e.key){var r=_w(document.activeElement,fw);r&&(e.preventDefault(),r.focus())}else if("ArrowDown"===e.key){var o=xw(document.activeElement,fw);o&&(e.preventDefault(),o.focus())}},Ew=function(e){if("ArrowLeft"===e.key){var t=Sw(document.activeElement,dw),n=Array.from(document.querySelectorAll(".".concat(fw)));n.length>t&&(e.preventDefault(),n[t].focus())}else if("ArrowUp"===e.key){var r=_w(document.activeElement,dw);r&&(e.preventDefault(),r.focus())}else if("ArrowDown"===e.key){var o=xw(document.activeElement,dw);o&&(e.preventDefault(),o.focus())}else if("Enter"===e.key||" "===e.key){e.preventDefault();var i=document.activeElement;i.click(),i.focus()}},Tw=function(e){"ArrowUp"===e.key?(e.preventDefault(),Cw()):"ArrowDown"===e.key?(e.preventDefault(),ww()):"ArrowRight"===e.key&&(e.preventDefault(),document.activeElement.nextElementSibling.focus())},Aw=function(e){if("ArrowLeft"===e.key)e.preventDefault(),document.activeElement.previousElementSibling.focus();else if("ArrowRight"===e.key){e.preventDefault();var t=Array.from(document.querySelectorAll(".".concat(fw)));t.length>0&&t[0].focus()}};function Lw(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 9.75v6.75m0 0-3-3m3 3 3-3m-8.25 6a4.5 4.5 0 0 1-1.41-8.775 5.25 5.25 0 0 1 10.233-2.33 3 3 0 0 1 3.758 3.848A3.752 3.752 0 0 1 18 19.5H6.75Z"})])}const Pw={__name:"DownloadLink",props:["url"],setup:function(e){var t=e,n=function(){Qv.get("".concat(t.url,"/request")).then((function(e){r(e.data.url)})).catch((function(e){e.response&&e.response.data&&alert("".concat(e.message,": ").concat(e.response.data.message,". Check developer console for more info."))}))},r=function(e){var t=document.createElement("a");t.href=e,t.setAttribute("download",""),document.body.appendChild(t),t.click(),document.body.removeChild(t)};return function(e,t){return ps(),bs("button",{onClick:n},[Gr(e.$slots,"default",{},(function(){return[Es(en(Lw),{class:"w-4 h-4 mr-2"}),Ps(" Download ")]}))])}}};function Rw(e){return Rw="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Rw(e)}function Iw(){Iw=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},s=i.iterator||"@@iterator",a=i.asyncIterator||"@@asyncIterator",l=i.toStringTag||"@@toStringTag";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var i=t&&t.prototype instanceof m?t:m,s=Object.create(i.prototype),a=new L(r||[]);return o(s,"_invoke",{value:O(e,n,a)}),s}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=c;var d="suspendedStart",p="suspendedYield",h="executing",v="completed",g={};function m(){}function y(){}function b(){}var w={};u(w,s,(function(){return this}));var C=Object.getPrototypeOf,_=C&&C(C(P([])));_&&_!==n&&r.call(_,s)&&(w=_);var x=b.prototype=m.prototype=Object.create(w);function S(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function n(o,i,s,a){var l=f(e[o],e,i);if("throw"!==l.type){var u=l.arg,c=u.value;return c&&"object"==Rw(c)&&r.call(c,"__await")?t.resolve(c.__await).then((function(e){n("next",e,s,a)}),(function(e){n("throw",e,s,a)})):t.resolve(c).then((function(e){u.value=e,s(u)}),(function(e){return n("throw",e,s,a)}))}a(l.arg)}var i;o(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,o){n(e,r,t,o)}))}return i=i?i.then(o,o):o()}})}function O(t,n,r){var o=d;return function(i,s){if(o===h)throw Error("Generator is already running");if(o===v){if("throw"===i)throw s;return{value:e,done:!0}}for(r.method=i,r.arg=s;;){var a=r.delegate;if(a){var l=E(a,r);if(l){if(l===g)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===d)throw o=v,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=h;var u=f(t,n,r);if("normal"===u.type){if(o=r.done?v:p,u.arg===g)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(o=v,r.method="throw",r.arg=u.arg)}}}function E(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,E(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var i=f(o,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,g;var s=i.arg;return s?s.done?(n[t.resultName]=s.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):s:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function A(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function L(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function P(t){if(t||""===t){var n=t[s];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function n(){for(;++o=0;--i){var s=this.tryEntries[i],a=s.completion;if("root"===s.tryLoc)return o("end");if(s.tryLoc<=this.prev){var l=r.call(s,"catchLoc"),u=r.call(s,"finallyLoc");if(l&&u){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),A(n),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;A(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:P(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),g}},t}function jw(e,t,n,r,o,i,s){try{var a=e[i](s),l=a.value}catch(e){return void n(e)}a.done?t(l):Promise.resolve(l).then(r,o)}var Nw={class:"file-item group"},Mw={key:0,class:"sr-only"},Fw={key:1,class:"sr-only"},Dw={key:2,class:"my-auto mr-2"},Bw=["checked","value"],Uw={class:"file-name"},Vw=Os("span",{class:"sr-only"},"Name:",-1),Hw={class:"file-size"},$w=Os("span",{class:"sr-only"},"Size:",-1),qw={class:"py-2"},zw={class:"text-brand-500"},Ww=Os("div",{class:"divider"},null,-1);const Zw={__name:"FileListItem",props:{logFile:{type:Object,required:!0},showSelectToggle:{type:Boolean,default:!1}},emits:["selectForDeletion"],setup:function(e,t){t.emit;var n=e,r=Xb(),o=Am(),i=ow(),s=i.dropdownDirections,a=i.calculateDropdownDirection,l=fa((function(){return r.selectedFile&&r.selectedFile.identifier===n.logFile.identifier})),u=function(){var e=function(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function s(e){jw(i,r,o,s,a,"next",e)}function a(e){jw(i,r,o,s,a,"throw",e)}s(void 0)}))}}(Iw().mark((function e(){return Iw().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!confirm("Are you sure you want to delete the log file '".concat(n.logFile.name,"'? THIS ACTION CANNOT BE UNDONE."))){e.next=6;break}return e.next=3,r.deleteFile(n.logFile);case 3:return n.logFile.identifier===r.selectedFileIdentifier&&rw(o,"file",null),e.next=6,r.loadFolders();case 6:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),c=function(){r.checkBoxToggle(n.logFile.identifier)},f=function(){r.toggleCheckboxVisibility(),c()};return function(t,n){return ps(),bs("div",{class:X(["file-item-container",[l.value?"active":""]])},[Es(en(Ay),null,{default:Qn((function(){return[Os("div",Nw,[Os("button",{class:"file-item-info",onKeydown:n[0]||(n[0]=function(){return en(Tw)&&en(Tw).apply(void 0,arguments)})},[l.value?Is("",!0):(ps(),bs("span",Mw,"Select log file")),l.value?(ps(),bs("span",Fw,"Deselect log file")):Is("",!0),e.logFile.can_delete?Xn((ps(),bs("span",Dw,[Os("input",{type:"checkbox",onClick:Zl(c,["stop"]),checked:en(r).isChecked(e.logFile),value:en(r).isChecked(e.logFile)},null,8,Bw)],512)),[[Ya,en(r).checkBoxesVisibility]]):Is("",!0),Os("span",Uw,[Vw,Ps(he(e.logFile.name),1)]),Os("span",Hw,[$w,Ps(he(e.logFile.size_formatted),1)])],32),Es(en(Ly),{as:"button",class:"file-dropdown-toggle group-hover:border-brand-600 group-hover:dark:border-brand-800","data-toggle-id":e.logFile.identifier,onKeydown:en(Aw),onClick:n[1]||(n[1]=Zl((function(e){return en(a)(e.target)}),["stop"]))},{default:Qn((function(){return[Es(en(Uy),{class:"w-4 h-4 pointer-events-none"})]})),_:1},8,["data-toggle-id","onKeydown"])]),Es(Pa,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:Qn((function(){return[Es(en(Py),{as:"div",class:X(["dropdown w-48",[en(s)[e.logFile.identifier]]])},{default:Qn((function(){return[Os("div",qw,[Es(en(Ry),{onClick:n[2]||(n[2]=Zl((function(t){return en(r).clearCacheForFile(e.logFile)}),["stop","prevent"]))},{default:Qn((function(t){return[Os("button",{class:X([t.active?"active":""])},[Xn(Es(en(Vy),{class:"h-4 w-4 mr-2"},null,512),[[Ya,!en(r).clearingCache[e.logFile.identifier]]]),Xn(Es(uw,null,null,512),[[Ya,en(r).clearingCache[e.logFile.identifier]]]),Xn(Os("span",null,"Clear index",512),[[Ya,!en(r).cacheRecentlyCleared[e.logFile.identifier]&&!en(r).clearingCache[e.logFile.identifier]]]),Xn(Os("span",null,"Clearing...",512),[[Ya,!en(r).cacheRecentlyCleared[e.logFile.identifier]&&en(r).clearingCache[e.logFile.identifier]]]),Xn(Os("span",zw,"Index cleared",512),[[Ya,en(r).cacheRecentlyCleared[e.logFile.identifier]]])],2)]})),_:1}),e.logFile.can_download?(ps(),ws(en(Ry),{key:0,onClick:n[3]||(n[3]=Zl((function(){}),["stop"]))},{default:Qn((function(t){var n=t.active;return[Es(Pw,{url:e.logFile.download_url,class:X([n?"active":""])},null,8,["url","class"])]})),_:1})):Is("",!0),e.logFile.can_delete?(ps(),bs(as,{key:1},[Ww,Es(en(Ry),{onClick:Zl(u,["stop","prevent"])},{default:Qn((function(e){return[Os("button",{class:X([e.active?"active":""])},[Es(en(My),{class:"w-4 h-4 mr-2"}),Ps(" Delete ")],2)]})),_:1}),Es(en(Ry),{onClick:Zl(f,["stop"])},{default:Qn((function(e){return[Os("button",{class:X([e.active?"active":""])},[Es(en(My),{class:"w-4 h-4 mr-2"}),Ps(" Delete Multiple ")],2)]})),_:1})],64)):Is("",!0)])]})),_:1},8,["class"])]})),_:1})]})),_:1})],2)}}},Kw=Zw;function Yw(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 0 1 1.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.559.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.894.149c-.424.07-.764.383-.929.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 0 1-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.398.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 0 1-.12-1.45l.527-.737c.25-.35.272-.806.108-1.204-.165-.397-.506-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.108-1.204l-.526-.738a1.125 1.125 0 0 1 .12-1.45l.773-.773a1.125 1.125 0 0 1 1.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894Z"}),Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"})])}function Gw(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M7.217 10.907a2.25 2.25 0 1 0 0 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186 9.566-5.314m-9.566 7.5 9.566 5.314m0 0a2.25 2.25 0 1 0 3.935 2.186 2.25 2.25 0 0 0-3.935-2.186Zm0-12.814a2.25 2.25 0 1 0 3.933-2.185 2.25 2.25 0 0 0-3.933 2.185Z"})])}function Jw(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25"})])}function Qw(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z"})])}function Xw(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z"})])}function eC(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z"})])}function tC(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"})])}function nC(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"fill-rule":"evenodd",d:"M16.704 4.153a.75.75 0 0 1 .143 1.052l-8 10.5a.75.75 0 0 1-1.127.075l-4.5-4.5a.75.75 0 0 1 1.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 0 1 1.05-.143Z","clip-rule":"evenodd"})])}var rC={class:"checkmark w-[18px] h-[18px] bg-gray-50 dark:bg-gray-800 rounded border dark:border-gray-600 inline-flex items-center justify-center"};const oC={__name:"Checkmark",props:{checked:{type:Boolean,required:!0}},setup:function(e){return function(t,n){return ps(),bs("div",rC,[e.checked?(ps(),ws(en(nC),{key:0,width:"18",height:"18",class:"w-full h-full"})):Is("",!0)])}}};var iC={width:"884",height:"1279",viewBox:"0 0 884 1279",fill:"none",xmlns:"http://www.w3.org/2000/svg"},sC=[Rs('',14)];const aC={},lC=(0,aw.A)(aC,[["render",function(e,t){return ps(),bs("svg",iC,sC)}]]);var uC=Os("span",{class:"sr-only"},"Settings dropdown",-1),cC={class:"py-2"},fC=Os("div",{class:"label"},"Settings",-1),dC=Os("span",{class:"ml-3"},"Shorter stack traces",-1),pC=Os("div",{class:"divider"},null,-1),hC=Os("div",{class:"label"},"Actions",-1),vC={class:"text-brand-500"},gC={class:"text-brand-500"},mC=Os("div",{class:"divider"},null,-1),yC=["innerHTML"],bC=Os("div",{class:"divider"},null,-1),wC={class:"w-4 h-4 mr-3 flex flex-col items-center"};const CC={__name:"SiteSettingsDropdown",setup:function(e){var t=Wb(),n=Xb(),r=Yt(!1),o=function(){nw(window.location.href),r.value=!0,setTimeout((function(){return r.value=!1}),2e3)};return Fi((function(){return t.shorterStackTraces}),(function(){return t.loadLogs()})),function(e,i){return ps(),ws(en(Ay),{as:"div",class:"relative"},{default:Qn((function(){return[Es(en(Ly),{as:"button",class:"menu-button"},{default:Qn((function(){return[uC,Es(en(Yw),{class:"w-5 h-5"})]})),_:1}),Es(Pa,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:Qn((function(){return[Es(en(Py),{as:"div",style:{"min-width":"250px"},class:"dropdown"},{default:Qn((function(){return[Os("div",cC,[fC,Es(en(Ry),null,{default:Qn((function(e){return[Os("button",{class:X([e.active?"active":""]),onClick:i[0]||(i[0]=Zl((function(e){return en(t).shorterStackTraces=!en(t).shorterStackTraces}),["stop","prevent"]))},[Es(oC,{checked:en(t).shorterStackTraces},null,8,["checked"]),dC],2)]})),_:1}),pC,hC,Es(en(Ry),{onClick:Zl(en(n).clearCacheForAllFiles,["stop","prevent"])},{default:Qn((function(e){return[Os("button",{class:X([e.active?"active":""])},[Xn(Es(en(Vy),{class:"w-4 h-4 mr-1.5"},null,512),[[Ya,!en(n).clearingCache["*"]]]),Xn(Es(uw,{class:"w-4 h-4 mr-1.5"},null,512),[[Ya,en(n).clearingCache["*"]]]),Xn(Os("span",null,"Clear indices for all files",512),[[Ya,!en(n).cacheRecentlyCleared["*"]&&!en(n).clearingCache["*"]]]),Xn(Os("span",null,"Please wait...",512),[[Ya,!en(n).cacheRecentlyCleared["*"]&&en(n).clearingCache["*"]]]),Xn(Os("span",vC,"File indices cleared",512),[[Ya,en(n).cacheRecentlyCleared["*"]]])],2)]})),_:1},8,["onClick"]),Es(en(Ry),{onClick:Zl(o,["stop","prevent"])},{default:Qn((function(e){return[Os("button",{class:X([e.active?"active":""])},[Es(en(Gw),{class:"w-4 h-4"}),Xn(Os("span",null,"Share this page",512),[[Ya,!r.value]]),Xn(Os("span",gC,"Link copied!",512),[[Ya,r.value]])],2)]})),_:1}),mC,Es(en(Ry),{onClick:i[1]||(i[1]=Zl((function(e){return en(t).toggleTheme()}),["stop","prevent"]))},{default:Qn((function(e){return[Os("button",{class:X([e.active?"active":""])},[Xn(Es(en(Jw),{class:"w-4 h-4"},null,512),[[Ya,en(t).theme===en(qb).System]]),Xn(Es(en(Qw),{class:"w-4 h-4"},null,512),[[Ya,en(t).theme===en(qb).Light]]),Xn(Es(en(Xw),{class:"w-4 h-4"},null,512),[[Ya,en(t).theme===en(qb).Dark]]),Os("span",null,[Ps("Theme: "),Os("span",{innerHTML:en(t).theme,class:"font-semibold"},null,8,yC)])],2)]})),_:1}),Es(en(Ry),null,{default:Qn((function(e){var n=e.active;return[Os("button",{onClick:i[2]||(i[2]=function(e){return en(t).helpSlideOverOpen=!0}),class:X([n?"active":""])},[Es(en(eC),{class:"w-4 h-4"}),Ps(" Keyboard Shortcuts ")],2)]})),_:1}),Es(en(Ry),null,{default:Qn((function(e){return[Os("a",{href:"https://log-viewer.opcodes.io/docs",target:"_blank",class:X([e.active?"active":""])},[Es(en(eC),{class:"w-4 h-4"}),Ps(" Documentation ")],2)]})),_:1}),Es(en(Ry),null,{default:Qn((function(e){return[Os("a",{href:"https://www.github.com/opcodesio/log-viewer",target:"_blank",class:X([e.active?"active":""])},[Es(en(eC),{class:"w-4 h-4"}),Ps(" Help ")],2)]})),_:1}),bC,Es(en(Ry),null,{default:Qn((function(e){var t=e.active;return[Os("a",{href:"https://www.buymeacoffee.com/arunas",target:"_blank",class:X([t?"active":""])},[Os("div",wC,[Es(lC,{class:"h-4 w-auto"})]),Os("strong",{class:X([t?"text-white":"text-brand-500"])},"Show your support",2),Es(en(tC),{class:"ml-2 w-4 h-4 opacity-75"})],2)]})),_:1})])]})),_:1})]})),_:1})]})),_:1})}}};var _C=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(_C||{});let xC=hr({name:"Hidden",props:{as:{type:[Object,String],default:"div"},features:{type:Number,default:1}},setup:(e,{slots:t,attrs:n})=>()=>{var r;let{features:o,...i}=e;return wy({ourProps:{"aria-hidden":!(2&~o)||(null!=(r=i["aria-hidden"])?r:void 0),hidden:!(4&~o)||void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...!(4&~o)&&!!(2&~o)&&{display:"none"}}},theirProps:i,slot:{},attrs:n,slots:t,name:"Hidden"})}});function SC(e={},t=null,n=[]){for(let[r,o]of Object.entries(e))OC(n,kC(t,r),o);return n}function kC(e,t){return e?e+"["+t+"]":t}function OC(e,t,n){if(Array.isArray(n))for(let[r,o]of n.entries())OC(e,kC(t,r.toString()),o);else n instanceof Date?e.push([t,n.toISOString()]):"boolean"==typeof n?e.push([t,n?"1":"0"]):"string"==typeof n?e.push([t,n]):"number"==typeof n?e.push([t,`${n}`]):null==n?e.push([t,""]):SC(n,t,e)}function EC(e,t){return e===t}var TC=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(TC||{}),AC=(e=>(e[e.Single=0]="Single",e[e.Multi=1]="Multi",e))(AC||{}),LC=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(LC||{});let PC=Symbol("ListboxContext");function RC(e){let t=Fo(PC,null);if(null===t){let t=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,RC),t}return t}let IC=hr({name:"Listbox",emits:{"update:modelValue":e=>!0},props:{as:{type:[Object,String],default:"template"},disabled:{type:[Boolean],default:!1},by:{type:[String,Function],default:()=>EC},horizontal:{type:[Boolean],default:!1},modelValue:{type:[Object,String,Number,Boolean],default:void 0},defaultValue:{type:[Object,String,Number,Boolean],default:void 0},form:{type:String,optional:!0},name:{type:String,optional:!0},multiple:{type:[Boolean],default:!1}},inheritAttrs:!1,setup(e,{slots:t,attrs:n,emit:r}){let o=Yt(1),i=Yt(null),s=Yt(null),a=Yt(null),l=Yt([]),u=Yt(""),c=Yt(null),f=Yt(1);function d(e=e=>e){let t=null!==c.value?l.value[c.value]:null,n=Jm(e(l.value.slice()),(e=>jm(e.dataRef.domRef))),r=t?n.indexOf(t):null;return-1===r&&(r=null),{options:n,activeOptionIndex:r}}let p=fa((()=>e.multiple?1:0)),[h,v]=function(e,t,n){let r=Yt(null==n?void 0:n.value),o=fa((()=>void 0!==e.value));return[fa((()=>o.value?e.value:r.value)),function(e){return o.value||(r.value=e),null==t?void 0:t(e)}]}(fa((()=>e.modelValue)),(e=>r("update:modelValue",e)),fa((()=>e.defaultValue))),g=fa((()=>void 0===h.value?Nm(p.value,{1:[],0:void 0}):h.value)),m={listboxState:o,value:g,mode:p,compare(t,n){if("string"==typeof e.by){let r=e.by;return(null==t?void 0:t[r])===(null==n?void 0:n[r])}return e.by(t,n)},orientation:fa((()=>e.horizontal?"horizontal":"vertical")),labelRef:i,buttonRef:s,optionsRef:a,disabled:fa((()=>e.disabled)),options:l,searchQuery:u,activeOptionIndex:c,activationTrigger:f,closeListbox(){e.disabled||1!==o.value&&(o.value=1,c.value=null)},openListbox(){e.disabled||0!==o.value&&(o.value=0)},goToOption(t,n,r){if(e.disabled||1===o.value)return;let i=d(),s=my(t===gy.Specific?{focus:gy.Specific,id:n}:{focus:t},{resolveItems:()=>i.options,resolveActiveIndex:()=>i.activeOptionIndex,resolveId:e=>e.id,resolveDisabled:e=>e.dataRef.disabled});u.value="",c.value=s,f.value=null!=r?r:1,l.value=i.options},search(t){if(e.disabled||1===o.value)return;let n=""!==u.value?0:1;u.value+=t.toLowerCase();let r=(null!==c.value?l.value.slice(c.value+n).concat(l.value.slice(0,c.value+n)):l.value).find((e=>e.dataRef.textValue.startsWith(u.value)&&!e.dataRef.disabled)),i=r?l.value.indexOf(r):-1;-1===i||i===c.value||(c.value=i,f.value=1)},clearSearch(){e.disabled||1!==o.value&&""!==u.value&&(u.value="")},registerOption(e,t){let n=d((n=>[...n,{id:e,dataRef:t}]));l.value=n.options,c.value=n.activeOptionIndex},unregisterOption(e){let t=d((t=>{let n=t.findIndex((t=>t.id===e));return-1!==n&&t.splice(n,1),t}));l.value=t.options,c.value=t.activeOptionIndex,f.value=1},theirOnChange(t){e.disabled||v(t)},select(t){e.disabled||v(Nm(p.value,{0:()=>t,1:()=>{let e=Ut(m.value.value).slice(),n=Ut(t),r=e.findIndex((e=>m.compare(n,Ut(e))));return-1===r?e.push(n):e.splice(r,1),e}}))}};ry([s,a],((e,t)=>{var n;m.closeListbox(),Wm(t,zm.Loose)||(e.preventDefault(),null==(n=jm(s))||n.focus())}),fa((()=>0===o.value))),Mo(PC,m),hy(fa((()=>Nm(o.value,{0:dy.Open,1:dy.Closed}))));let y=fa((()=>{var e;return null==(e=jm(s))?void 0:e.closest("form")}));return Pr((()=>{Fi([y],(()=>{if(y.value&&void 0!==e.defaultValue)return y.value.addEventListener("reset",t),()=>{var e;null==(e=y.value)||e.removeEventListener("reset",t)};function t(){m.theirOnChange(e.defaultValue)}}),{immediate:!0})})),()=>{let{name:r,modelValue:i,disabled:s,form:a,...l}=e,u={open:0===o.value,disabled:s,value:g.value};return da(as,[...null!=r&&null!=g.value?SC({[r]:g.value}).map((([e,t])=>da(xC,function(e){let t=Object.assign({},e);for(let e in t)void 0===t[e]&&delete t[e];return t}({features:_C.Hidden,key:e,as:"input",type:"hidden",hidden:!0,readOnly:!0,form:a,disabled:s,name:e,value:t})))):[],wy({ourProps:{},theirProps:{...n,...Sy(l,["defaultValue","onUpdate:modelValue","horizontal","multiple","by"])},slot:u,slots:t,attrs:n,name:"Listbox"})])}}}),jC=hr({name:"ListboxLabel",props:{as:{type:[Object,String],default:"label"},id:{type:String,default:null}},setup(e,{attrs:t,slots:n}){var r;let o=null!=(r=e.id)?r:`headlessui-listbox-label-${Im()}`,i=RC("ListboxLabel");function s(){var e;null==(e=jm(i.buttonRef))||e.focus({preventScroll:!0})}return()=>{let r={open:0===i.listboxState.value,disabled:i.disabled.value},{...a}=e;return wy({ourProps:{id:o,ref:i.labelRef,onClick:s},theirProps:a,slot:r,attrs:t,slots:n,name:"ListboxLabel"})}}}),NC=hr({name:"ListboxButton",props:{as:{type:[Object,String],default:"button"},id:{type:String,default:null}},setup(e,{attrs:t,slots:n,expose:r}){var o;let i=null!=(o=e.id)?o:`headlessui-listbox-button-${Im()}`,s=RC("ListboxButton");function a(e){switch(e.key){case vy.Space:case vy.Enter:case vy.ArrowDown:e.preventDefault(),s.openListbox(),jn((()=>{var e;null==(e=jm(s.optionsRef))||e.focus({preventScroll:!0}),s.value.value||s.goToOption(gy.First)}));break;case vy.ArrowUp:e.preventDefault(),s.openListbox(),jn((()=>{var e;null==(e=jm(s.optionsRef))||e.focus({preventScroll:!0}),s.value.value||s.goToOption(gy.Last)}))}}function l(e){if(e.key===vy.Space)e.preventDefault()}function u(e){s.disabled.value||(0===s.listboxState.value?(s.closeListbox(),jn((()=>{var e;return null==(e=jm(s.buttonRef))?void 0:e.focus({preventScroll:!0})}))):(e.preventDefault(),s.openListbox(),function(e){requestAnimationFrame((()=>requestAnimationFrame(e)))}((()=>{var e;return null==(e=jm(s.optionsRef))?void 0:e.focus({preventScroll:!0})}))))}r({el:s.buttonRef,$el:s.buttonRef});let c=iy(fa((()=>({as:e.as,type:t.type}))),s.buttonRef);return()=>{var r,o;let f={open:0===s.listboxState.value,disabled:s.disabled.value,value:s.value.value},{...d}=e;return wy({ourProps:{ref:s.buttonRef,id:i,type:c.value,"aria-haspopup":"listbox","aria-controls":null==(r=jm(s.optionsRef))?void 0:r.id,"aria-expanded":0===s.listboxState.value,"aria-labelledby":s.labelRef.value?[null==(o=jm(s.labelRef))?void 0:o.id,i].join(" "):void 0,disabled:!0===s.disabled.value||void 0,onKeydown:a,onKeyup:l,onClick:u},theirProps:d,slot:f,attrs:t,slots:n,name:"ListboxButton"})}}}),MC=hr({name:"ListboxOptions",props:{as:{type:[Object,String],default:"ul"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(e,{attrs:t,slots:n,expose:r}){var o;let i=null!=(o=e.id)?o:`headlessui-listbox-options-${Im()}`,s=RC("ListboxOptions"),a=Yt(null);function l(e){switch(a.value&&clearTimeout(a.value),e.key){case vy.Space:if(""!==s.searchQuery.value)return e.preventDefault(),e.stopPropagation(),s.search(e.key);case vy.Enter:if(e.preventDefault(),e.stopPropagation(),null!==s.activeOptionIndex.value){let e=s.options.value[s.activeOptionIndex.value];s.select(e.dataRef.value)}0===s.mode.value&&(s.closeListbox(),jn((()=>{var e;return null==(e=jm(s.buttonRef))?void 0:e.focus({preventScroll:!0})})));break;case Nm(s.orientation.value,{vertical:vy.ArrowDown,horizontal:vy.ArrowRight}):return e.preventDefault(),e.stopPropagation(),s.goToOption(gy.Next);case Nm(s.orientation.value,{vertical:vy.ArrowUp,horizontal:vy.ArrowLeft}):return e.preventDefault(),e.stopPropagation(),s.goToOption(gy.Previous);case vy.Home:case vy.PageUp:return e.preventDefault(),e.stopPropagation(),s.goToOption(gy.First);case vy.End:case vy.PageDown:return e.preventDefault(),e.stopPropagation(),s.goToOption(gy.Last);case vy.Escape:e.preventDefault(),e.stopPropagation(),s.closeListbox(),jn((()=>{var e;return null==(e=jm(s.buttonRef))?void 0:e.focus({preventScroll:!0})}));break;case vy.Tab:e.preventDefault(),e.stopPropagation();break;default:1===e.key.length&&(s.search(e.key),a.value=setTimeout((()=>s.clearSearch()),350))}}r({el:s.optionsRef,$el:s.optionsRef});let u=py(),c=fa((()=>null!==u?(u.value&dy.Open)===dy.Open:0===s.listboxState.value));return()=>{var r,o;let a={open:0===s.listboxState.value},{...u}=e;return wy({ourProps:{"aria-activedescendant":null===s.activeOptionIndex.value||null==(r=s.options.value[s.activeOptionIndex.value])?void 0:r.id,"aria-multiselectable":1===s.mode.value||void 0,"aria-labelledby":null==(o=jm(s.buttonRef))?void 0:o.id,"aria-orientation":s.orientation.value,id:i,onKeydown:l,role:"listbox",tabIndex:0,ref:s.optionsRef},theirProps:u,slot:a,attrs:t,slots:n,features:yy.RenderStrategy|yy.Static,visible:c.value,name:"ListboxOptions"})}}}),FC=hr({name:"ListboxOption",props:{as:{type:[Object,String],default:"li"},value:{type:[Object,String,Number,Boolean]},disabled:{type:Boolean,default:!1},id:{type:String,default:null}},setup(e,{slots:t,attrs:n,expose:r}){var o;let i=null!=(o=e.id)?o:`headlessui-listbox-option-${Im()}`,s=RC("ListboxOption"),a=Yt(null);r({el:a,$el:a});let l=fa((()=>null!==s.activeOptionIndex.value&&s.options.value[s.activeOptionIndex.value].id===i)),u=fa((()=>Nm(s.mode.value,{0:()=>s.compare(Ut(s.value.value),Ut(e.value)),1:()=>Ut(s.value.value).some((t=>s.compare(Ut(t),Ut(e.value))))}))),c=fa((()=>Nm(s.mode.value,{1:()=>{var e;let t=Ut(s.value.value);return(null==(e=s.options.value.find((e=>t.some((t=>s.compare(Ut(t),Ut(e.dataRef.value)))))))?void 0:e.id)===i},0:()=>u.value}))),f=ly(a),d=fa((()=>({disabled:e.disabled,value:e.value,get textValue(){return f()},domRef:a})));function p(t){if(e.disabled)return t.preventDefault();s.select(e.value),0===s.mode.value&&(s.closeListbox(),jn((()=>{var e;return null==(e=jm(s.buttonRef))?void 0:e.focus({preventScroll:!0})})))}function h(){if(e.disabled)return s.goToOption(gy.Nothing);s.goToOption(gy.Specific,i)}Pr((()=>s.registerOption(i,d))),Nr((()=>s.unregisterOption(i))),Pr((()=>{Fi([s.listboxState,u],(()=>{0===s.listboxState.value&&u.value&&Nm(s.mode.value,{1:()=>{c.value&&s.goToOption(gy.Specific,i)},0:()=>{s.goToOption(gy.Specific,i)}})}),{immediate:!0})})),Ii((()=>{0===s.listboxState.value&&l.value&&0!==s.activationTrigger.value&&jn((()=>{var e,t;return null==(t=null==(e=jm(a))?void 0:e.scrollIntoView)?void 0:t.call(e,{block:"nearest"})}))}));let v=cy();function g(e){v.update(e)}function m(t){v.wasMoved(t)&&(e.disabled||l.value||s.goToOption(gy.Specific,i,0))}function y(t){v.wasMoved(t)&&(e.disabled||l.value&&s.goToOption(gy.Nothing))}return()=>{let{disabled:r}=e,o={active:l.value,selected:u.value,disabled:r},{value:s,disabled:c,...f}=e;return wy({ourProps:{id:i,ref:a,role:"option",tabIndex:!0===r?void 0:-1,"aria-disabled":!0===r||void 0,"aria-selected":u.value,disabled:void 0,onClick:p,onFocus:h,onPointerenter:g,onMouseenter:g,onPointermove:m,onMousemove:m,onPointerleave:y,onMouseleave:y},theirProps:f,slot:o,attrs:n,slots:t,name:"ListboxOption"})}}});function DC(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"fill-rule":"evenodd",d:"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"})])}var BC={class:"relative mt-1"},UC={class:"block truncate"},VC={class:"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"};const HC={__name:"HostSelector",setup:function(e){var t=Am(),n=$y();return Fi((function(){return n.selectedHost}),(function(e){rw(t,"host",null!=e&&e.is_remote?e.identifier:null)})),function(e,t){return ps(),ws(en(IC),{as:"div",modelValue:en(n).selectedHostIdentifier,"onUpdate:modelValue":t[0]||(t[0]=function(e){return en(n).selectedHostIdentifier=e})},{default:Qn((function(){return[Es(en(jC),{class:"ml-1 block text-sm text-gray-500 dark:text-gray-400"},{default:Qn((function(){return[Ps("Select host")]})),_:1}),Os("div",BC,[Es(en(NC),{id:"hosts-toggle-button",class:"cursor-pointer relative text-gray-800 dark:text-gray-200 w-full cursor-default rounded-md border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 py-2 pl-4 pr-10 text-left hover:border-brand-600 hover:dark:border-brand-800 focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-500 text-sm"},{default:Qn((function(){var e;return[Os("span",UC,he((null===(e=en(n).selectedHost)||void 0===e?void 0:e.name)||"Please select a server"),1),Os("span",VC,[Es(en(DC),{class:"h-5 w-5 text-gray-400","aria-hidden":"true"})])]})),_:1}),Es(Pa,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:Qn((function(){return[Es(en(MC),{class:"absolute z-20 mt-1 max-h-60 w-full overflow-auto rounded-md shadow-md bg-white dark:bg-gray-800 py-1 border border-gray-200 dark:border-gray-700 ring-1 ring-brand ring-opacity-5 focus:outline-none text-sm"},{default:Qn((function(){return[(ps(!0),bs(as,null,Kr(en(n).hosts,(function(e){return ps(),ws(en(FC),{as:"template",key:e.identifier,value:e.identifier},{default:Qn((function(t){var n=t.active,r=t.selected;return[Os("li",{class:X([n?"text-white bg-brand-600":"text-gray-900 dark:text-gray-300","relative cursor-default select-none py-2 pl-3 pr-9"])},[Os("span",{class:X([r?"font-semibold":"font-normal","block truncate"])},he(e.name),3),r?(ps(),bs("span",{key:0,class:X([n?"text-white":"text-brand-600","absolute inset-y-0 right-0 flex items-center pr-4"])},[Es(en(nC),{class:"h-5 w-5","aria-hidden":"true"})],2)):Is("",!0)],2)]})),_:2},1032,["value"])})),128))]})),_:1})]})),_:1})])]})),_:1},8,["modelValue"])}}},$C=HC;var qC={class:"relative mt-1"},zC={class:"block truncate"},WC={class:"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"};const ZC={__name:"FileTypeSelector",setup:function(e){Am();var t=Xb();return function(e,n){return ps(),ws(en(IC),{as:"div",modelValue:en(t).selectedFileTypes,"onUpdate:modelValue":n[0]||(n[0]=function(e){return en(t).selectedFileTypes=e}),multiple:""},{default:Qn((function(){return[Es(en(jC),{class:"ml-1 block text-sm text-gray-500 dark:text-gray-400"},{default:Qn((function(){return[Ps("Selected file types")]})),_:1}),Os("div",qC,[Es(en(NC),{id:"hosts-toggle-button",class:"cursor-pointer relative text-gray-800 dark:text-gray-200 w-full cursor-default rounded-md border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 py-2 pl-4 pr-10 text-left hover:border-brand-600 hover:dark:border-brand-800 focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-500 text-sm"},{default:Qn((function(){return[Os("span",zC,he(en(t).selectedFileTypesString),1),Os("span",WC,[Es(en(DC),{class:"h-5 w-5 text-gray-400","aria-hidden":"true"})])]})),_:1}),Es(Pa,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:Qn((function(){return[Es(en(MC),{class:"absolute z-20 mt-1 max-h-60 w-full overflow-auto rounded-md shadow-md bg-white dark:bg-gray-800 py-1 border border-gray-200 dark:border-gray-700 ring-1 ring-brand ring-opacity-5 focus:outline-none text-sm"},{default:Qn((function(){return[(ps(!0),bs(as,null,Kr(en(t).fileTypesAvailable,(function(e){return ps(),ws(en(FC),{as:"template",key:e.identifier,value:e.identifier},{default:Qn((function(t){var n=t.active,r=t.selected;return[Os("li",{class:X([n?"text-white bg-brand-600":"text-gray-900 dark:text-gray-300","relative cursor-default select-none py-2 pl-3 pr-9"])},[Os("span",{class:X([r?"font-semibold":"font-normal","block truncate"])},he(e.name),3),r?(ps(),bs("span",{key:0,class:X([n?"text-white":"text-brand-600","absolute inset-y-0 right-0 flex items-center pr-4"])},[Es(en(nC),{class:"h-5 w-5","aria-hidden":"true"})],2)):Is("",!0)],2)]})),_:2},1032,["value"])})),128))]})),_:1})]})),_:1})])]})),_:1},8,["modelValue"])}}};function KC(e){return KC="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},KC(e)}function YC(){YC=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},s=i.iterator||"@@iterator",a=i.asyncIterator||"@@asyncIterator",l=i.toStringTag||"@@toStringTag";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var i=t&&t.prototype instanceof m?t:m,s=Object.create(i.prototype),a=new L(r||[]);return o(s,"_invoke",{value:O(e,n,a)}),s}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=c;var d="suspendedStart",p="suspendedYield",h="executing",v="completed",g={};function m(){}function y(){}function b(){}var w={};u(w,s,(function(){return this}));var C=Object.getPrototypeOf,_=C&&C(C(P([])));_&&_!==n&&r.call(_,s)&&(w=_);var x=b.prototype=m.prototype=Object.create(w);function S(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function n(o,i,s,a){var l=f(e[o],e,i);if("throw"!==l.type){var u=l.arg,c=u.value;return c&&"object"==KC(c)&&r.call(c,"__await")?t.resolve(c.__await).then((function(e){n("next",e,s,a)}),(function(e){n("throw",e,s,a)})):t.resolve(c).then((function(e){u.value=e,s(u)}),(function(e){return n("throw",e,s,a)}))}a(l.arg)}var i;o(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,o){n(e,r,t,o)}))}return i=i?i.then(o,o):o()}})}function O(t,n,r){var o=d;return function(i,s){if(o===h)throw Error("Generator is already running");if(o===v){if("throw"===i)throw s;return{value:e,done:!0}}for(r.method=i,r.arg=s;;){var a=r.delegate;if(a){var l=E(a,r);if(l){if(l===g)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===d)throw o=v,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=h;var u=f(t,n,r);if("normal"===u.type){if(o=r.done?v:p,u.arg===g)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(o=v,r.method="throw",r.arg=u.arg)}}}function E(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,E(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var i=f(o,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,g;var s=i.arg;return s?s.done?(n[t.resultName]=s.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):s:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function A(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function L(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function P(t){if(t||""===t){var n=t[s];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function n(){for(;++o=0;--i){var s=this.tryEntries[i],a=s.completion;if("root"===s.tryLoc)return o("end");if(s.tryLoc<=this.prev){var l=r.call(s,"catchLoc"),u=r.call(s,"finallyLoc");if(l&&u){if(this.prev=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),A(n),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;A(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:P(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),g}},t}function GC(e,t,n,r,o,i,s){try{var a=e[i](s),l=a.value}catch(e){return void n(e)}a.done?t(l):Promise.resolve(l).then(r,o)}function JC(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function s(e){GC(i,r,o,s,a,"next",e)}function a(e){GC(i,r,o,s,a,"throw",e)}s(void 0)}))}}var QC={class:"flex flex-col h-full py-5"},XC={class:"mx-3 md:mx-0 mb-1"},e_={class:"sm:flex sm:flex-col-reverse"},t_={class:"font-semibold text-brand-700 dark:text-brand-600 text-2xl flex items-center"},n_=Os("a",{href:"https://www.github.com/opcodesio/log-viewer",target:"_blank",class:"rounded ml-3 text-gray-400 hover:text-brand-800 dark:hover:text-brand-600 focus:outline-none focus:ring-2 focus:ring-brand-500 dark:focus:ring-brand-700 p-1"},[Os("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-5 w-5",viewBox:"0 0 24 24",fill:"currentColor",title:""},[Os("path",{d:"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"})])],-1),r_={class:"md:hidden flex-1 flex justify-end"},o_={type:"button",class:"menu-button"},i_={key:0},s_=["href"],a_={key:0,class:"bg-yellow-100 dark:bg-yellow-900 bg-opacity-75 dark:bg-opacity-40 border border-yellow-300 dark:border-yellow-800 rounded-md px-2 py-1 mt-2 text-xs leading-5 text-yellow-700 dark:text-yellow-400"},l_=Os("code",{class:"font-mono px-2 py-1 bg-gray-100 dark:bg-gray-900 rounded"},"php artisan log-viewer:publish",-1),u_={key:3,class:"flex justify-between items-baseline mt-6"},c_={class:"ml-1 block text-sm text-gray-500 dark:text-gray-400 truncate"},f_={class:"text-sm text-gray-500 dark:text-gray-400"},d_=Os("label",{for:"file-sort-direction",class:"sr-only"},"Sort direction",-1),p_=[Os("option",{value:"desc"},"Newest first",-1),Os("option",{value:"asc"},"Oldest first",-1)],h_={key:4,class:"mx-1 mt-1 text-red-600 text-xs"},v_=Os("p",{class:"text-sm text-gray-600 dark:text-gray-400"},"Please select files to delete and confirm or cancel deletion.",-1),g_={id:"file-list-container",class:"relative h-full overflow-hidden"},m_=["id"],y_=["onClick"],b_={class:"file-item group"},w_={key:0,class:"sr-only"},C_={key:1,class:"sr-only"},__={class:"file-icon group-hover:hidden group-focus:hidden"},x_={class:"file-icon hidden group-hover:inline-block group-focus:inline-block"},S_={class:"file-name"},k_={key:0},O_=Os("span",{class:"text-gray-500 dark:text-gray-400"},"root",-1),E_={key:1},T_=Os("span",{class:"sr-only"},"Open folder options",-1),A_={class:"py-2"},L_={class:"text-brand-500"},P_=Os("div",{class:"divider"},null,-1),R_=["onClick","disabled"],I_={class:"folder-files pl-3 ml-1 border-l border-gray-200 dark:border-gray-800"},j_={key:0,class:"text-center text-sm text-gray-600 dark:text-gray-400"},N_=Os("p",{class:"mb-5"},"No log files were found.",-1),M_={class:"flex items-center justify-center px-1"},F_=Os("div",{class:"pointer-events-none absolute z-10 bottom-0 h-4 w-full bg-gradient-to-t from-gray-100 dark:from-gray-900 to-transparent"},null,-1),D_={class:"absolute inset-y-0 left-3 right-7 lg:left-0 lg:right-0 z-10"},B_={class:"rounded-md bg-white text-gray-800 dark:bg-gray-700 dark:text-gray-200 opacity-90 w-full h-full flex items-center justify-center"};const U_={__name:"FileList",setup:function(e){var t=Am(),n=Lm(),r=$y(),o=Xb(),i=ow(),s=i.dropdownDirections,a=i.calculateDropdownDirection,l=function(){var e=JC(YC().mark((function e(n){return YC().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!confirm("Are you sure you want to delete the log folder '".concat(n.path,"'? THIS ACTION CANNOT BE UNDONE."))){e.next=4;break}return e.next=3,o.deleteFolder(n);case 3:n.files.some((function(e){return e.identifier===o.selectedFileIdentifier}))&&rw(t,"file",null);case 4:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),u=function(){var e=JC(YC().mark((function e(){return YC().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!confirm("Are you sure you want to delete selected log files? THIS ACTION CANNOT BE UNDONE.")){e.next=7;break}return e.next=3,o.deleteSelectedFiles();case 3:return o.filesChecked.includes(o.selectedFileIdentifier)&&rw(t,"file",null),o.resetChecks(),e.next=7,o.loadFolders();case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return Pr(JC(YC().mark((function e(){return YC().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r.selectHost(n.query.host||null);case 1:case"end":return e.stop()}}),e)})))),Fi((function(){return o.direction}),(function(){return o.loadFolders()})),function(e,i){var c,f;return ps(),bs("nav",QC,[Os("div",XC,[Os("div",e_,[Os("h1",t_,[Ps(" Log Viewer "),n_,Os("span",r_,[Es(CC,{class:"ml-2"}),Os("button",o_,[Es(en(Iy),{class:"w-5 h-5 ml-2",onClick:en(o).toggleSidebar},null,8,["onClick"])])])]),e.LogViewer.back_to_system_url?(ps(),bs("div",i_,[Os("a",{href:e.LogViewer.back_to_system_url,class:"rounded shrink inline-flex items-center text-sm text-gray-500 dark:text-gray-400 hover:text-brand-800 dark:hover:text-brand-600 focus:outline-none focus:ring-2 focus:ring-brand-500 dark:focus:ring-brand-700 mt-0"},[Es(en(jy),{class:"h-3 w-3 mr-1.5"}),Ps(" "+he(e.LogViewer.back_to_system_label||"Back to ".concat(e.LogViewer.app_name)),1)],8,s_)])):Is("",!0)]),e.LogViewer.assets_outdated?(ps(),bs("div",a_,[Es(en(Ny),{class:"h-4 w-4 mr-1 inline"}),Ps(" Front-end assets are outdated. To update, please run "),l_])):Is("",!0),en(r).supportsHosts&&en(r).hasRemoteHosts?(ps(),ws($C,{key:1,class:"mb-8 mt-6"})):Is("",!0),en(o).fileTypesAvailable&&en(o).fileTypesAvailable.length>1?(ps(),ws(ZC,{key:2,class:"mb-8 mt-6"})):Is("",!0),(null===(c=en(o).filteredFolders)||void 0===c?void 0:c.length)>0?(ps(),bs("div",u_,[Os("div",c_,"Log files on "+he(null===(f=en(o).selectedHost)||void 0===f?void 0:f.name),1),Os("div",f_,[d_,Xn(Os("select",{id:"file-sort-direction",class:"select","onUpdate:modelValue":i[0]||(i[0]=function(e){return en(o).direction=e})},p_,512),[[Dl,en(o).direction]])])])):Is("",!0),en(o).error?(ps(),bs("p",h_,he(en(o).error),1)):Is("",!0)]),Xn(Os("div",null,[v_,Os("div",{class:X(["grid grid-flow-col pr-4 mt-2",[en(o).hasFilesChecked?"justify-between":"justify-end"]])},[Xn(Os("button",{onClick:Zl(u,["stop"]),class:"button inline-flex"},[Es(en(My),{class:"w-5 mr-1"}),Ps(" Delete selected files ")],512),[[Ya,en(o).hasFilesChecked]]),Os("button",{class:"button inline-flex",onClick:i[1]||(i[1]=Zl((function(e){return en(o).resetChecks()}),["stop"]))},[Ps(" Cancel "),Es(en(Iy),{class:"w-5 ml-1"})])],2)],512),[[Ya,en(o).checkBoxesVisibility]]),Os("div",g_,[Os("div",{class:"file-list",onScroll:i[6]||(i[6]=function(e){return en(o).onScroll(e)})},[(ps(!0),bs(as,null,Kr(en(o).filteredFolders,(function(e){return ps(),bs("div",{key:e.identifier,id:"folder-".concat(e.identifier),class:"relative folder-container"},[Es(en(Ay),null,{default:Qn((function(t){var n=t.open;return[Os("div",{class:X(["folder-item-container",[en(o).isOpen(e)?"active-folder":"",en(o).shouldBeSticky(e)?"sticky "+(n?"z-20":"z-10"):""]]),onClick:function(t){return en(o).toggle(e)}},[Os("div",b_,[Os("button",{class:"file-item-info group",onKeydown:i[2]||(i[2]=function(){return en(Tw)&&en(Tw).apply(void 0,arguments)})},[en(o).isOpen(e)?Is("",!0):(ps(),bs("span",w_,"Open folder")),en(o).isOpen(e)?(ps(),bs("span",C_,"Close folder")):Is("",!0),Os("span",__,[Xn(Es(en(Fy),{class:"w-5 h-5"},null,512),[[Ya,!en(o).isOpen(e)]]),Xn(Es(en(Dy),{class:"w-5 h-5"},null,512),[[Ya,en(o).isOpen(e)]])]),Os("span",x_,[Es(en(By),{class:X([en(o).isOpen(e)?"rotate-90":"","transition duration-100"])},null,8,["class"])]),Os("span",S_,[String(e.clean_path||"").startsWith("root")?(ps(),bs("span",k_,[O_,Ps(he(String(e.clean_path).substring(4)),1)])):(ps(),bs("span",E_,he(e.clean_path),1))])],32),Es(en(Ly),{as:"button",class:"file-dropdown-toggle group-hover:border-brand-600 group-hover:dark:border-brand-800","data-toggle-id":e.identifier,onKeydown:en(Aw),onClick:i[3]||(i[3]=Zl((function(e){return en(a)(e.target)}),["stop"]))},{default:Qn((function(){return[T_,Es(en(Uy),{class:"w-4 h-4 pointer-events-none"})]})),_:2},1032,["data-toggle-id","onKeydown"])]),Es(Pa,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:Qn((function(){return[Xn(Es(en(Py),{static:"",as:"div",class:X(["dropdown w-48",[en(s)[e.identifier]]])},{default:Qn((function(){return[Os("div",A_,[Es(en(Ry),{onClick:Zl((function(t){return en(o).clearCacheForFolder(e)}),["stop","prevent"])},{default:Qn((function(t){return[Os("button",{class:X([t.active?"active":""])},[Xn(Es(en(Vy),{class:"w-4 h-4 mr-2"},null,512),[[Ya,!en(o).clearingCache[e.identifier]]]),Xn(Es(uw,{class:"w-4 h-4 mr-2"},null,512),[[Ya,en(o).clearingCache[e.identifier]]]),Xn(Os("span",null,"Clear indices",512),[[Ya,!en(o).cacheRecentlyCleared[e.identifier]&&!en(o).clearingCache[e.identifier]]]),Xn(Os("span",null,"Clearing...",512),[[Ya,!en(o).cacheRecentlyCleared[e.identifier]&&en(o).clearingCache[e.identifier]]]),Xn(Os("span",L_,"Indices cleared",512),[[Ya,en(o).cacheRecentlyCleared[e.identifier]]])],2)]})),_:2},1032,["onClick"]),e.can_download?(ps(),ws(en(Ry),{key:0},{default:Qn((function(t){var n=t.active;return[Es(Pw,{url:e.download_url,onClick:i[4]||(i[4]=Zl((function(){}),["stop"])),class:X([n?"active":""])},null,8,["url","class"])]})),_:2},1024)):Is("",!0),e.can_delete?(ps(),bs(as,{key:1},[P_,Es(en(Ry),null,{default:Qn((function(t){var n=t.active;return[Os("button",{onClick:Zl((function(t){return l(e)}),["stop"]),disabled:en(o).deleting[e.identifier],class:X([n?"active":""])},[Xn(Es(en(My),{class:"w-4 h-4 mr-2"},null,512),[[Ya,!en(o).deleting[e.identifier]]]),Xn(Es(uw,null,null,512),[[Ya,en(o).deleting[e.identifier]]]),Ps(" Delete ")],10,R_)]})),_:2},1024)],64)):Is("",!0)])]})),_:2},1032,["class"]),[[Ya,n]])]})),_:2},1024)],10,y_)]})),_:2},1024),Xn(Os("div",I_,[(ps(!0),bs(as,null,Kr(e.files||[],(function(e){return ps(),ws(Kw,{key:e.identifier,"log-file":e,onClick:function(r){return o=e.identifier,void(n.query.file&&n.query.file===o?rw(t,"file",null):rw(t,"file",o));var o}},null,8,["log-file","onClick"])})),128))],512),[[Ya,en(o).isOpen(e)]])],8,m_)})),128)),0===en(o).folders.length?(ps(),bs("div",j_,[N_,Os("div",M_,[Os("button",{onClick:i[5]||(i[5]=Zl((function(e){return en(o).loadFolders()}),["prevent"])),class:"inline-flex items-center px-4 py-2 text-left text-sm bg-white hover:bg-gray-50 outline-brand-500 dark:outline-brand-800 text-gray-900 dark:text-gray-200 rounded-md dark:bg-gray-700 dark:hover:bg-gray-600"},[Es(en(Hy),{class:"w-4 h-4 mr-1.5"}),Ps(" Refresh file list ")])])])):Is("",!0)],32),F_,Xn(Os("div",D_,[Os("div",B_,[Es(uw,{class:"w-14 h-14"})])],512),[[Ya,en(o).loading]])])])}}},V_=U_;function H_(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"fill-rule":"evenodd",d:"M4.755 10.059a7.5 7.5 0 0 1 12.548-3.364l1.903 1.903h-3.183a.75.75 0 1 0 0 1.5h4.992a.75.75 0 0 0 .75-.75V4.356a.75.75 0 0 0-1.5 0v3.18l-1.9-1.9A9 9 0 0 0 3.306 9.67a.75.75 0 1 0 1.45.388Zm15.408 3.352a.75.75 0 0 0-.919.53 7.5 7.5 0 0 1-12.548 3.364l-1.902-1.903h3.183a.75.75 0 0 0 0-1.5H2.984a.75.75 0 0 0-.75.75v4.992a.75.75 0 0 0 1.5 0v-3.18l1.9 1.9a9 9 0 0 0 15.059-4.035.75.75 0 0 0-.53-.918Z","clip-rule":"evenodd"})])}function $_(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"fill-rule":"evenodd",d:"M3 6.75A.75.75 0 0 1 3.75 6h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 6.75ZM3 12a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 12Zm0 5.25a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75a.75.75 0 0 1-.75-.75Z","clip-rule":"evenodd"})])}function q_(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M13.5 4.5 21 12m0 0-7.5 7.5M21 12H3"})])}var z_={class:"pagination"},W_={class:"previous"},Z_=["disabled"],K_=Os("span",{class:"sm:hidden"},"Previous page",-1),Y_={class:"sm:hidden border-transparent text-gray-500 dark:text-gray-400 border-t-2 pt-3 px-4 inline-flex items-center text-sm font-medium"},G_={class:"pages"},J_={key:0,class:"border-brand-500 text-brand-600 dark:border-brand-600 dark:text-brand-500","aria-current":"page"},Q_={key:1},X_=["onClick"],ex={class:"next"},tx=["disabled"],nx=Os("span",{class:"sm:hidden"},"Next page",-1);const rx={__name:"Pagination",props:{loading:{type:Boolean,required:!0},short:{type:Boolean,default:!1}},setup:function(e){var t=Vb(),n=Am(),r=Lm(),o=(fa((function(){return Number(r.query.page)||1})),function(e){e<1&&(e=1),t.pagination&&e>t.pagination.last_page&&(e=t.pagination.last_page),rw(n,"page",e>1?Number(e):null)}),i=function(){return o(t.page+1)},s=function(){return o(t.page-1)};return Pr((function(){document.addEventListener("goToNextPage",i),document.addEventListener("goToPreviousPage",s)})),jr((function(){document.removeEventListener("goToNextPage",i),document.removeEventListener("goToPreviousPage",s)})),function(n,r){return ps(),bs("nav",z_,[Os("div",W_,[1!==en(t).page?(ps(),bs("button",{key:0,onClick:s,disabled:e.loading,rel:"prev"},[Es(en(jy),{class:"h-5 w-5"}),K_],8,Z_)):Is("",!0)]),Os("div",Y_,[Os("span",null,he(en(t).page),1)]),Os("div",G_,[(ps(!0),bs(as,null,Kr(e.short?en(t).linksShort:en(t).links,(function(e){return ps(),bs(as,null,[e.active?(ps(),bs("button",J_,he(Number(e.label).toLocaleString()),1)):"..."===e.label?(ps(),bs("span",Q_,he(e.label),1)):(ps(),bs("button",{key:2,onClick:function(t){return o(Number(e.label))},class:"border-transparent text-gray-500 dark:text-gray-400 hover:text-gray-700 hover:border-gray-300 dark:hover:text-gray-300 dark:hover:border-gray-400"},he(Number(e.label).toLocaleString()),9,X_))],64)})),256))]),Os("div",ex,[en(t).hasMorePages?(ps(),bs("button",{key:0,onClick:i,disabled:e.loading,rel:"next"},[nx,Es(en(q_),{class:"h-5 w-5"})],8,tx)):Is("",!0)])])}}},ox=rx;function ix(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m19.5 8.25-7.5 7.5-7.5-7.5"})])}var sx={class:"flex items-center"},ax={class:"opacity-90 mr-1"},lx={class:"font-semibold"},ux={class:"opacity-90 mr-1"},cx={class:"font-semibold"},fx={key:2,class:"opacity-90"},dx={key:3,class:"opacity-90"},px={class:"py-2"},hx={class:"label flex justify-between"},vx={key:0,class:"no-results"},gx={class:"flex-1 inline-flex justify-between"},mx={class:"log-count"};const yx={__name:"LevelButtons",setup:function(e){var t=Wb(),n=Hb();return Fi((function(){return n.excludedLevels}),(function(){return t.loadLogs()})),function(e,r){return ps(),bs("div",sx,[Es(en(Ay),{as:"div",class:"mr-5 relative log-levels-selector"},{default:Qn((function(){return[Es(en(Ly),{as:"button",id:"severity-dropdown-toggle",class:X(["dropdown-toggle badge none",en(n).levelsSelected.length>0?"active":""])},{default:Qn((function(){return[en(n).levelsSelected.length>2?(ps(),bs(as,{key:0},[Os("span",ax,he(en(n).totalResultsSelected.toLocaleString()+(en(t).hasMoreResults?"+":""))+" entries in",1),Os("strong",lx,he(en(n).levelsSelected[0].level_name)+" + "+he(en(n).levelsSelected.length-1)+" more",1)],64)):en(n).levelsSelected.length>0?(ps(),bs(as,{key:1},[Os("span",ux,he(en(n).totalResultsSelected.toLocaleString()+(en(t).hasMoreResults?"+":""))+" entries in",1),Os("strong",cx,he(en(n).levelsSelected.map((function(e){return e.level_name})).join(", ")),1)],64)):en(n).levelsFound.length>0?(ps(),bs("span",fx,he(en(n).totalResults.toLocaleString()+(en(t).hasMoreResults?"+":""))+" entries found. None selected",1)):(ps(),bs("span",dx,"No entries found")),Es(en(ix),{class:"w-4 h-4"})]})),_:1},8,["class"]),Es(Pa,{"leave-active-class":"transition ease-in duration-100","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-90","enter-active-class":"transition ease-out duration-100","enter-from-class":"opacity-0 scale-90","enter-to-class":"opacity-100 scale-100"},{default:Qn((function(){return[Es(en(Py),{as:"div",class:"dropdown down left min-w-[240px]"},{default:Qn((function(){return[Os("div",px,[Os("div",hx,[Ps(" Severity "),en(n).levelsFound.length>0?(ps(),bs(as,{key:0},[en(n).levelsSelected.length===en(n).levelsFound.length?(ps(),ws(en(Ry),{key:0,onClick:Zl(en(n).deselectAllLevels,["stop"])},{default:Qn((function(e){return[Os("a",{class:X(["inline-link px-2 -mr-2 py-1 -my-1 rounded-md cursor-pointer text-brand-700 dark:text-brand-500 font-normal",[e.active?"active":""]])}," Deselect all ",2)]})),_:1},8,["onClick"])):(ps(),ws(en(Ry),{key:1,onClick:Zl(en(n).selectAllLevels,["stop"])},{default:Qn((function(e){return[Os("a",{class:X(["inline-link px-2 -mr-2 py-1 -my-1 rounded-md cursor-pointer text-brand-700 dark:text-brand-500 font-normal",[e.active?"active":""]])}," Select all ",2)]})),_:1},8,["onClick"]))],64)):Is("",!0)]),0===en(n).levelsFound.length?(ps(),bs("div",vx,"There are no severity filters to display because no entries have been found.")):(ps(!0),bs(as,{key:1},Kr(en(n).levelsFound,(function(e){return ps(),ws(en(Ry),{onClick:Zl((function(t){return en(n).toggleLevel(e.level)}),["stop","prevent"])},{default:Qn((function(t){return[Os("button",{class:X([t.active?"active":""])},[Es(oC,{class:"checkmark mr-2.5",checked:e.selected},null,8,["checked"]),Os("span",gx,[Os("span",{class:X(["log-level",e.level_class])},he(e.level_name),3),Os("span",mx,he(Number(e.count).toLocaleString()),1)])],2)]})),_:2},1032,["onClick"])})),256))])]})),_:1})]})),_:1})]})),_:1})])}}};function bx(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"})])}var wx={class:"flex-1"},Cx={class:"prefix-icon"},_x=Os("label",{for:"query",class:"sr-only"},"Search",-1),xx={class:"relative flex-1 m-1"},Sx={class:"clear-search"},kx={class:"submit-search"},Ox={key:0,disabled:"disabled"},Ex={class:"hidden xl:inline ml-1"},Tx={class:"hidden xl:inline ml-1"},Ax={class:"relative h-0 w-full overflow-visible"},Lx=["innerHTML"];const Px={__name:"SearchInput",setup:function(e){var t=Ub(),n=Wb(),r=Am(),o=Lm(),i=fa((function(){return n.selectedFile})),s=Yt(o.query.query||""),a=function(){var e;rw(r,"query",""===s.value?null:s.value),null===(e=document.getElementById("query-submit"))||void 0===e||e.focus()},l=function(){s.value="",a()};return Fi((function(){return o.query.query}),(function(e){return s.value=e||""})),function(e,r){return ps(),bs("div",wx,[Os("div",{class:X(["search",{"has-error":en(n).error}])},[Os("div",Cx,[_x,Xn(Es(en(bx),{class:"h-4 w-4"},null,512),[[Ya,!en(n).hasMoreResults]]),Xn(Es(uw,{class:"w-4 h-4"},null,512),[[Ya,en(n).hasMoreResults]])]),Os("div",xx,[Xn(Os("input",{"onUpdate:modelValue":r[0]||(r[0]=function(e){return s.value=e}),name:"query",id:"query",type:"text",onKeydown:[Yl(a,["enter"]),r[1]||(r[1]=Yl((function(e){return e.target.blur()}),["esc"]))]},null,544),[[jl,s.value]]),Xn(Os("div",Sx,[Os("button",{onClick:l},[Es(en(Iy),{class:"h-4 w-4"})])],512),[[Ya,en(t).hasQuery]])]),Os("div",kx,[en(n).hasMoreResults?(ps(),bs("button",Ox,[Os("span",null,[Ps("Searching"),Os("span",Ex,he(i.value?i.value.name:"all files"),1),Ps("...")])])):(ps(),bs("button",{key:1,onClick:a,id:"query-submit"},[Os("span",null,[Ps("Search"),Os("span",Tx,he(i.value?'in "'+i.value.name+'"':"all files"),1)]),Es(en(q_),{class:"h-4 w-4"})]))])],2),Os("div",Ax,[Xn(Os("div",{class:"search-progress-bar",style:K({width:en(n).percentScanned+"%"})},null,4),[[Ya,en(n).hasMoreResults]])]),Xn(Os("p",{class:"mt-1 text-red-600 text-xs",innerHTML:en(n).error},null,8,Lx),[[Ya,en(n).error]])])}}},Rx=Px;function Ix(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"fill-rule":"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z","clip-rule":"evenodd"})])}function jx(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"fill-rule":"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z","clip-rule":"evenodd"})])}function Nx(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"fill-rule":"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z","clip-rule":"evenodd"})])}function Mx(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"fill-rule":"evenodd",d:"M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 0 1 .67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 1 1-.671-1.34l.041-.022ZM12 9a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z","clip-rule":"evenodd"})])}function Fx(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"fill-rule":"evenodd",d:"M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z","clip-rule":"evenodd"})])}function Dx(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244"})])}function Bx(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{d:"M7.493 18.5c-.425 0-.82-.236-.975-.632A7.48 7.48 0 0 1 6 15.125c0-1.75.599-3.358 1.602-4.634.151-.192.373-.309.6-.397.473-.183.89-.514 1.212-.924a9.042 9.042 0 0 1 2.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 0 0 .322-1.672V2.75A.75.75 0 0 1 15 2a2.25 2.25 0 0 1 2.25 2.25c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 0 1-2.649 7.521c-.388.482-.987.729-1.605.729H14.23c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 0 0-1.423-.23h-.777ZM2.331 10.727a11.969 11.969 0 0 0-.831 4.398 12 12 0 0 0 .52 3.507C2.28 19.482 3.105 20 3.994 20H4.9c.445 0 .72-.498.523-.898a8.963 8.963 0 0 1-.924-3.977c0-1.708.476-3.305 1.302-4.666.245-.403-.028-.959-.5-.959H4.25c-.832 0-1.612.453-1.918 1.227Z"})])}var Ux={class:"sr-only"},Vx={class:"text-green-600 dark:text-green-500 hidden md:inline"};const Hx={__name:"LogCopyButton",props:{log:{type:Object,required:!0}},setup:function(e){var t=e,n=Yt(!1),r=function(){nw(t.log.url),n.value=!0,setTimeout((function(){return n.value=!1}),1e3)};return function(t,o){return ps(),bs("button",{class:"log-link group",onClick:Zl(r,["stop"]),onKeydown:o[0]||(o[0]=function(){return en(Ew)&&en(Ew).apply(void 0,arguments)}),title:"Copy link to this log entry"},[Os("span",Ux,"Log index "+he(e.log.index)+". Click the button to copy link to this log entry.",1),Xn(Os("span",{class:"hidden md:inline group-hover:underline"},he(Number(e.log.index).toLocaleString()),513),[[Ya,!n.value]]),Xn(Es(en(Dx),{class:"md:opacity-75 group-hover:opacity-100"},null,512),[[Ya,!n.value]]),Xn(Es(en(Bx),{class:"text-green-600 dark:text-green-500 md:hidden"},null,512),[[Ya,n.value]]),Xn(Os("span",Vx,"Copied!",512),[[Ya,n.value]])],32)}}};var $x={key:0,class:"tabs-container"},qx={class:"border-b border-gray-200 dark:border-gray-800"},zx={class:"-mb-px flex space-x-6","aria-label":"Tabs"},Wx=["onClick","aria-current"];const Zx={__name:"TabContainer",props:{tabs:{type:Array,required:!0}},setup:function(e){var t=Yt(e.tabs[0]);Mo("currentTab",t);var n=function(e){return t.value&&t.value.value===e.value};return function(r,o){return ps(),bs("div",null,[e.tabs&&e.tabs.length>1?(ps(),bs("div",$x,[Os("div",qx,[Os("nav",zx,[(ps(!0),bs(as,null,Kr(e.tabs,(function(e){return ps(),bs("a",{key:e.name,href:"#",onClick:Zl((function(n){return t.value=e}),["prevent"]),class:X([n(e)?"border-brand-500 dark:border-brand-400 text-brand-600 dark:text-brand-500":"border-transparent text-gray-500 dark:text-gray-400 hover:border-gray-300 hover:text-gray-700 dark:hover:text-gray-200","whitespace-nowrap border-b-2 py-2 px-1 text-sm font-medium focus:outline-brand-500"]),"aria-current":n(e)?"page":void 0},he(e.name),11,Wx)})),128))])])])):Is("",!0),Gr(r.$slots,"default")])}}};var Kx={key:0};const Yx={__name:"TabContent",props:{tabValue:{type:String,required:!0}},setup:function(e){var t=e,n=Fo("currentTab"),r=fa((function(){return n.value&&n.value.value===t.tabValue}));return function(e,t){return r.value?(ps(),bs("div",Kx,[Gr(e.$slots,"default")])):Is("",!0)}}};function Gx(e,t){return ps(),bs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[Os("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m18.375 12.739-7.693 7.693a4.5 4.5 0 0 1-6.364-6.364l10.94-10.94A3 3 0 1 1 19.5 7.372L8.552 18.32m.009-.01-.01.01m5.699-9.941-7.81 7.81a1.5 1.5 0 0 0 2.112 2.13"})])}var Jx={class:"mail-preview-attributes"},Qx={key:0},Xx=Os("td",{class:"font-semibold"},"From",-1),eS={key:1},tS=Os("td",{class:"font-semibold"},"To",-1),nS={key:2},rS=Os("td",{class:"font-semibold"},"Message ID",-1),oS={key:3},iS=Os("td",{class:"font-semibold"},"Subject",-1),sS={key:4},aS=Os("td",{class:"font-semibold"},"Attachments",-1),lS={class:"flex items-center"},uS={class:"opacity-60"},cS=["onClick"];const fS={__name:"MailPreviewAttributes",props:["mail"],setup:function(e){return function(t,n){return ps(),bs("div",Jx,[Os("table",null,[e.mail.from?(ps(),bs("tr",Qx,[Xx,Os("td",null,he(e.mail.from),1)])):Is("",!0),e.mail.to?(ps(),bs("tr",eS,[tS,Os("td",null,he(e.mail.to),1)])):Is("",!0),e.mail.id?(ps(),bs("tr",nS,[rS,Os("td",null,he(e.mail.id),1)])):Is("",!0),e.mail.subject?(ps(),bs("tr",oS,[iS,Os("td",null,he(e.mail.subject),1)])):Is("",!0),e.mail.attachments&&e.mail.attachments.length>0?(ps(),bs("tr",sS,[aS,Os("td",null,[(ps(!0),bs(as,null,Kr(e.mail.attachments,(function(t,n){return ps(),bs("div",{key:"mail-".concat(e.mail.id,"-attachment-").concat(n),class:"mail-attachment-button"},[Os("div",lS,[Es(en(Gx),{class:"h-4 w-4 text-gray-500 dark:text-gray-400 mr-1"}),Os("span",null,[Ps(he(t.filename)+" ",1),Os("span",uS,"("+he(t.size_formatted)+")",1)])]),Os("div",null,[Os("a",{href:"#",onClick:Zl((function(e){return function(e){for(var t=atob(e.content),n=new Array(t.length),r=0;re.length)&&(t=e.length);for(var n=0,r=Array(t);n