From eee7750fa191c461c06ade659460f01fa2378592 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Mon, 11 Mar 2024 17:03:10 -0400 Subject: [PATCH 1/7] Activity Display Driver validation issue Should always return updated model for displaying proper data even if the model has failed to validate. --- .../Display/ActivityDisplayDriver.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/OrchardCore/OrchardCore.Workflows.Abstractions/Display/ActivityDisplayDriver.cs b/src/OrchardCore/OrchardCore.Workflows.Abstractions/Display/ActivityDisplayDriver.cs index d3487a62d10..e90d806cd77 100644 --- a/src/OrchardCore/OrchardCore.Workflows.Abstractions/Display/ActivityDisplayDriver.cs +++ b/src/OrchardCore/OrchardCore.Workflows.Abstractions/Display/ActivityDisplayDriver.cs @@ -42,10 +42,8 @@ public override IDisplayResult Edit(TActivity model) public async override Task UpdateAsync(TActivity model, IUpdateModel updater) { var viewModel = new TEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - await UpdateActivityAsync(viewModel, model); - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + await UpdateActivityAsync(viewModel, model); return Edit(model); } From 1bc669533609f8f45f1caeafb6ad280d5cca5fc6 Mon Sep 17 00:00:00 2001 From: Jasmin Savard Date: Mon, 11 Mar 2024 22:33:50 -0400 Subject: [PATCH 2/7] Remove all if on TryUpdateModelAsync --- .../AdminNodes/LinkAdminNodeDriver.cs | 21 +- .../AdminNodes/PlaceholderAdminNodeDriver.cs | 19 +- .../AliasPartSettingsDisplayDriver.cs | 17 +- .../Drivers/DateFieldDisplayDriver.cs | 11 +- .../Drivers/DateTimeFieldDisplayDriver.cs | 23 +- .../Drivers/HtmlFieldDisplayDriver.cs | 26 +- .../Drivers/MultiTextFieldDisplayDriver.cs | 15 +- .../Drivers/NumericFieldDisplayDriver.cs | 60 +- .../Drivers/TextFieldDisplayDriver.cs | 11 +- .../Drivers/TimeFieldDisplayDriver.cs | 11 +- .../Drivers/UserPickerFieldDisplayDriver.cs | 30 +- .../Drivers/YoutubeFieldDisplayDriver.cs | 55 +- .../ContentPickerFieldSettingsDriver.cs | 51 +- .../Settings/MultiTextFieldSettingsDriver.cs | 28 +- .../Settings/UserPickerFieldSettingsDriver.cs | 41 +- ...alizationContentsAdminListDisplayDriver.cs | 13 +- ...LocalizationPartContentsAdminListFilter.cs | 24 +- ...teContentDefinitionDeploymentStepDriver.cs | 9 +- .../ContentPartSettingsDisplayDriver.cs | 13 +- .../ContentTypeSettingsDisplayDriver.cs | 27 +- .../AdminNodes/ContentTypesAdminNodeDriver.cs | 27 +- .../AuditTrailPartSettingsDisplayDriver.cs | 11 +- .../ContentItemDeploymentStepDriver.cs | 19 +- .../CommonPartSettingsDisplayDriver.cs | 7 +- .../ContentTypesSitemapSourceDriver.cs | 57 +- .../Drivers/ContentEventDisplayDriver.cs | 8 +- .../TestContentElementDisplayDriver.cs | 17 +- .../Drivers/UserProfileDisplayDriver.cs | 13 +- .../Steps/JsonRecipeDeploymentStepDriver.cs | 26 +- .../AzureEmailSettingsDisplayDriver.cs | 111 +- .../Drivers/SmtpSettingsDisplayDriver.cs | 175 +- .../Drivers/EmailSettingsDisplayDriver.cs | 11 +- .../FacebookPluginPartDisplayDriver.cs | 17 +- .../Drivers/ButtonPartDisplayDriver.cs | 9 +- .../FormElementLabelPartDisplayDriver.cs | 9 +- .../Drivers/FormElementPartDisplayDriver.cs | 7 +- .../FormElementValidationPartDisplayDriver.cs | 7 +- .../FormInputElementPartDisplayDriver.cs | 15 +- .../Drivers/FormPartDisplayDriver.cs | 17 +- .../Drivers/InputPartDisplayDriver.cs | 11 +- .../Drivers/LabelPartDisplayDriver.cs | 7 +- .../Drivers/SelectPartDisplayDriver.cs | 25 +- .../Drivers/TextAreaPartDisplayDriver.cs | 9 +- .../Drivers/ValidationPartDisplayDriver.cs | 7 +- .../ValidationSummaryPartDisplayDriver.cs | 7 +- .../Drivers/HtmlBodyPartDisplayDriver.cs | 19 +- .../HtmlBodyPartSettingsDisplayDriver.cs | 9 +- .../Drivers/LayerMetadataWelder.cs | 4 +- .../Drivers/LiquidPartDisplayDriver.cs | 17 +- .../AdminNodes/ListsAdminNodeDriver.cs | 15 +- .../Drivers/ContainedPartDisplayDriver.cs | 10 +- .../ListPartContentsAdminListDisplayDriver.cs | 17 +- .../ListPartContentsAdminListFilter.cs | 31 +- .../Drivers/MarkdownBodyPartDisplayDriver.cs | 19 +- .../Drivers/MarkdownFieldDisplayDriver.cs | 19 +- .../MarkdownBodyPartSettingsDisplayDriver.cs | 9 +- .../Settings/MarkdownFieldSettingsDriver.cs | 11 +- .../js/vue/media-app/.vscode/launch.json | 20 + .../js/vue/media-app/.vscode/tasks.json | 35 + .../js/vue/media-app/dist/assets/index.css | 7523 +++ .../js/vue/media-app/dist/assets/index.js | 39775 ++++++++++++++++ .../Assets/js/vue/media-app/dist/index.html | 60 + .../Assets/js/vue/media-app/dist/vite.svg | 1 + .../Drivers/MediaFieldDisplayDriver.cs | 103 +- .../Settings/MediaFieldSettingsDriver.cs | 47 +- .../ContentMenuItemPartDisplayDriver.cs | 11 +- .../Drivers/HtmlMenuItemPartDisplayDriver.cs | 47 +- .../Drivers/LinkMenuItemPartDisplayDriver.cs | 49 +- .../Drivers/MenuPartDisplayDriver.cs | 3 +- .../HtmlMenuItemPartSettingsDisplayDriver.cs | 9 +- .../NotifyUserTaskActivityDisplayDriver.cs | 6 +- ...otificationPreferencesPartDisplayDriver.cs | 47 +- .../QueryBasedContentDeploymentStepDriver.cs | 40 +- .../Sql/Drivers/SqlQueryDisplayDriver.cs | 9 +- .../Drivers/ReCaptchaSettingsDisplayDriver.cs | 13 +- .../ContentTypeConditionDisplayDriver.cs | 11 +- .../Drivers/CultureConditionDisplayDriver.cs | 11 +- .../JavascriptConditionDisplayDriver.cs | 9 +- .../Drivers/RoleConditionDisplayDriver.cs | 11 +- .../Drivers/UrlConditionDisplayDriver.cs | 11 +- ...ureAISearchDefaultSettingsDisplayDriver.cs | 75 +- .../AzureAISearchSettingsDisplayDriver.cs | 40 +- .../Drivers/ElasticQueryDisplayDriver.cs | 11 +- .../Drivers/LuceneQueryDisplayDriver.cs | 11 +- .../Drivers/SearchFormPartDisplayDriver.cs | 9 +- .../Drivers/SearchSettingsDisplayDriver.cs | 11 +- .../Drivers/SeoMetaPartDisplayDriver.cs | 81 +- .../DefaultSiteSettingsDisplayDriver.cs | 41 +- .../Drivers/CustomPathSitemapSourceDriver.cs | 33 +- .../Drivers/SitemapPartDisplayDriver.cs | 15 +- .../Drivers/SmsSettingsDisplayDriver.cs | 21 +- .../Drivers/SmsTaskDisplayDriver.cs | 39 +- .../Drivers/TwilioSettingsDisplayDriver.cs | 100 +- .../TaxonomyContentsAdminListDisplayDriver.cs | 9 +- .../Drivers/TaxonomyFieldDisplayDriver.cs | 29 +- .../Drivers/TaxonomyFieldTagsDisplayDriver.cs | 53 +- .../Drivers/TaxonomyPartDisplayDriver.cs | 33 +- .../TaxonomyContentsAdminListFilter.cs | 33 +- ...yContentsAdminListSettingsDisplayDriver.cs | 7 +- .../Drivers/TitlePartDisplayDriver.cs | 19 +- .../Drivers/UserInformationDisplayDriver.cs | 29 +- .../Drivers/UserRoleDisplayDriver.cs | 95 +- .../Drivers/UserLocalizationDisplayDriver.cs | 7 +- .../Drivers/UserTimeZoneDisplayDriver.cs | 10 +- .../Drivers/RegisterUserTaskDisplayDriver.cs | 29 +- .../WidgetsListPartSettingsDisplayDriver.cs | 7 +- .../Drivers/ActivityMetadataDisplayDriver.cs | 7 +- .../MyTestPartSettingsDisplayDriver.cs | 7 +- 108 files changed, 48667 insertions(+), 1359 deletions(-) create mode 100644 src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/.vscode/launch.json create mode 100644 src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/.vscode/tasks.json create mode 100644 src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/assets/index.css create mode 100644 src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/assets/index.js create mode 100644 src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/index.html create mode 100644 src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/vite.svg diff --git a/src/OrchardCore.Modules/OrchardCore.AdminMenu/AdminNodes/LinkAdminNodeDriver.cs b/src/OrchardCore.Modules/OrchardCore.AdminMenu/AdminNodes/LinkAdminNodeDriver.cs index 8b46ca2bf06..780cdce97e4 100644 --- a/src/OrchardCore.Modules/OrchardCore.AdminMenu/AdminNodes/LinkAdminNodeDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.AdminMenu/AdminNodes/LinkAdminNodeDriver.cs @@ -56,19 +56,18 @@ public override IDisplayResult Edit(LinkAdminNode treeNode) public override async Task UpdateAsync(LinkAdminNode treeNode, IUpdateModel updater) { var model = new LinkAdminNodeViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix, x => x.LinkUrl, x => x.LinkText, x => x.IconClass, x => x.SelectedPermissionNames)) - { - treeNode.LinkText = model.LinkText; - treeNode.LinkUrl = model.LinkUrl; - treeNode.IconClass = model.IconClass; + await updater.TryUpdateModelAsync(model, Prefix, x => x.LinkUrl, x => x.LinkText, x => x.IconClass, x => x.SelectedPermissionNames); - var selectedPermissions = (model.SelectedPermissionNames == null ? [] : model.SelectedPermissionNames.Split(',', StringSplitOptions.RemoveEmptyEntries)); + treeNode.LinkText = model.LinkText; + treeNode.LinkUrl = model.LinkUrl; + treeNode.IconClass = model.IconClass; - var permissions = await _adminMenuPermissionService.GetPermissionsAsync(); - treeNode.PermissionNames = permissions - .Where(p => selectedPermissions.Contains(p.Name)) - .Select(p => p.Name).ToArray(); - } + var selectedPermissions = (model.SelectedPermissionNames == null ? [] : model.SelectedPermissionNames.Split(',', StringSplitOptions.RemoveEmptyEntries)); + + var permissions = await _adminMenuPermissionService.GetPermissionsAsync(); + treeNode.PermissionNames = permissions + .Where(p => selectedPermissions.Contains(p.Name)) + .Select(p => p.Name).ToArray(); return Edit(treeNode); } diff --git a/src/OrchardCore.Modules/OrchardCore.AdminMenu/AdminNodes/PlaceholderAdminNodeDriver.cs b/src/OrchardCore.Modules/OrchardCore.AdminMenu/AdminNodes/PlaceholderAdminNodeDriver.cs index 9976d19a583..0cfaa3053ce 100644 --- a/src/OrchardCore.Modules/OrchardCore.AdminMenu/AdminNodes/PlaceholderAdminNodeDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.AdminMenu/AdminNodes/PlaceholderAdminNodeDriver.cs @@ -55,17 +55,16 @@ public override IDisplayResult Edit(PlaceholderAdminNode treeNode) public override async Task UpdateAsync(PlaceholderAdminNode treeNode, IUpdateModel updater) { var model = new PlaceholderAdminNodeViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix, x => x.LinkText, x => x.IconClass, x => x.SelectedPermissionNames)) - { - treeNode.LinkText = model.LinkText; - treeNode.IconClass = model.IconClass; + await updater.TryUpdateModelAsync(model, Prefix, x => x.LinkText, x => x.IconClass, x => x.SelectedPermissionNames); - var selectedPermissions = (model.SelectedPermissionNames == null ? Array.Empty() : model.SelectedPermissionNames.Split(',', StringSplitOptions.RemoveEmptyEntries)); - var permissions = await _adminMenuPermissionService.GetPermissionsAsync(); - treeNode.PermissionNames = permissions - .Where(p => selectedPermissions.Contains(p.Name)) - .Select(p => p.Name).ToArray(); - } + treeNode.LinkText = model.LinkText; + treeNode.IconClass = model.IconClass; + + var selectedPermissions = (model.SelectedPermissionNames == null ? Array.Empty() : model.SelectedPermissionNames.Split(',', StringSplitOptions.RemoveEmptyEntries)); + var permissions = await _adminMenuPermissionService.GetPermissionsAsync(); + treeNode.PermissionNames = permissions + .Where(p => selectedPermissions.Contains(p.Name)) + .Select(p => p.Name).ToArray(); return Edit(treeNode); } diff --git a/src/OrchardCore.Modules/OrchardCore.Alias/Settings/AliasPartSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Alias/Settings/AliasPartSettingsDisplayDriver.cs index 1215a4b31c9..3b67103fd0d 100644 --- a/src/OrchardCore.Modules/OrchardCore.Alias/Settings/AliasPartSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Alias/Settings/AliasPartSettingsDisplayDriver.cs @@ -36,16 +36,15 @@ public override async Task UpdateAsync(ContentTypePartDefinition { var model = new AliasPartSettingsViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix, m => m.Pattern, m => m.Options)) + await context.Updater.TryUpdateModelAsync(model, Prefix, m => m.Pattern, m => m.Options); + + if (!string.IsNullOrEmpty(model.Pattern) && !_templateManager.Validate(model.Pattern, out var errors)) + { + context.Updater.ModelState.AddModelError(nameof(model.Pattern), S["Pattern doesn't contain a valid Liquid expression. Details: {0}", string.Join(" ", errors)]); + } + else { - if (!string.IsNullOrEmpty(model.Pattern) && !_templateManager.Validate(model.Pattern, out var errors)) - { - context.Updater.ModelState.AddModelError(nameof(model.Pattern), S["Pattern doesn't contain a valid Liquid expression. Details: {0}", string.Join(" ", errors)]); - } - else - { - context.Builder.WithSettings(new AliasPartSettings { Pattern = model.Pattern, Options = model.Options }); - } + context.Builder.WithSettings(new AliasPartSettings { Pattern = model.Pattern, Options = model.Options }); } return Edit(contentTypePartDefinition, context.Updater); diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/DateFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/DateFieldDisplayDriver.cs index 06a9096539b..9a319c82894 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/DateFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/DateFieldDisplayDriver.cs @@ -46,13 +46,12 @@ public override IDisplayResult Edit(DateField field, BuildFieldEditorContext con public override async Task UpdateAsync(DateField field, IUpdateModel updater, UpdateFieldEditorContext context) { - if (await updater.TryUpdateModelAsync(field, Prefix, f => f.Value)) + await updater.TryUpdateModelAsync(field, Prefix, f => f.Value); + var settings = context.PartFieldDefinition.GetSettings(); + + if (settings.Required && field.Value == null) { - var settings = context.PartFieldDefinition.GetSettings(); - if (settings.Required && field.Value == null) - { - updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); - } + updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); } return Edit(field, context); diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/DateTimeFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/DateTimeFieldDisplayDriver.cs index a9cdaae1af3..0c79a2ded8f 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/DateTimeFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/DateTimeFieldDisplayDriver.cs @@ -55,23 +55,22 @@ public override async Task UpdateAsync(DateTimeField field, IUpd { var model = new EditDateTimeFieldViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix, f => f.LocalDateTime)) + await updater.TryUpdateModelAsync(model, Prefix, f => f.LocalDateTime); + var settings = context.PartFieldDefinition.GetSettings(); + + if (settings.Required && model.LocalDateTime == null) + { + updater.ModelState.AddModelError(Prefix, nameof(model.LocalDateTime), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); + } + else { - var settings = context.PartFieldDefinition.GetSettings(); - if (settings.Required && model.LocalDateTime == null) + if (model.LocalDateTime == null) { - updater.ModelState.AddModelError(Prefix, nameof(model.LocalDateTime), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); + field.Value = null; } else { - if (model.LocalDateTime == null) - { - field.Value = null; - } - else - { - field.Value = await _localClock.ConvertToUtcAsync(model.LocalDateTime.Value); - } + field.Value = await _localClock.ConvertToUtcAsync(model.LocalDateTime.Value); } } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/HtmlFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/HtmlFieldDisplayDriver.cs index aafb66f4652..44c1c3fe5fe 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/HtmlFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/HtmlFieldDisplayDriver.cs @@ -84,22 +84,20 @@ public override async Task UpdateAsync(HtmlField field, IUpdateM var viewModel = new EditHtmlFieldViewModel(); var settings = context.PartFieldDefinition.GetSettings(); + await updater.TryUpdateModelAsync(viewModel, Prefix, f => f.Html); - if (await updater.TryUpdateModelAsync(viewModel, Prefix, f => f.Html)) + if (!string.IsNullOrEmpty(viewModel.Html) && !_liquidTemplateManager.Validate(viewModel.Html, out var errors)) { - if (!string.IsNullOrEmpty(viewModel.Html) && !_liquidTemplateManager.Validate(viewModel.Html, out var errors)) - { - var fieldName = context.PartFieldDefinition.DisplayName(); - context.Updater.ModelState.AddModelError( - Prefix, - nameof(viewModel.Html), S["{0} doesn't contain a valid Liquid expression. Details: {1}", - fieldName, - string.Join(' ', errors)]); - } - else - { - field.Html = settings.SanitizeHtml ? _htmlSanitizerService.Sanitize(viewModel.Html) : viewModel.Html; - } + var fieldName = context.PartFieldDefinition.DisplayName(); + context.Updater.ModelState.AddModelError( + Prefix, + nameof(viewModel.Html), S["{0} doesn't contain a valid Liquid expression. Details: {1}", + fieldName, + string.Join(' ', errors)]); + } + else + { + field.Html = settings.SanitizeHtml ? _htmlSanitizerService.Sanitize(viewModel.Html) : viewModel.Html; } return Edit(field, context); diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/MultiTextFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/MultiTextFieldDisplayDriver.cs index 913a73f30f1..54ffb0bdde2 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/MultiTextFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/MultiTextFieldDisplayDriver.cs @@ -59,15 +59,14 @@ public override IDisplayResult Edit(MultiTextField field, BuildFieldEditorContex public override async Task UpdateAsync(MultiTextField field, IUpdateModel updater, UpdateFieldEditorContext context) { var viewModel = new EditMultiTextFieldViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - field.Values = viewModel.Values; + await updater.TryUpdateModelAsync(viewModel, Prefix); - var settings = context.PartFieldDefinition.GetSettings(); - if (settings.Required && viewModel.Values.Length == 0) - { - updater.ModelState.AddModelError(Prefix, nameof(field.Values), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); - } + field.Values = viewModel.Values; + + var settings = context.PartFieldDefinition.GetSettings(); + if (settings.Required && viewModel.Values.Length == 0) + { + updater.ModelState.AddModelError(Prefix, nameof(field.Values), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); } return Edit(field, context); diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/NumericFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/NumericFieldDisplayDriver.cs index 61f63cbef0a..8aaf552bccf 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/NumericFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/NumericFieldDisplayDriver.cs @@ -67,48 +67,46 @@ public override async Task UpdateAsync(NumericField field, IUpda { var viewModel = new EditNumericFieldViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix, f => f.Value)) - { - var settings = context.PartFieldDefinition.GetSettings(); + await updater.TryUpdateModelAsync(viewModel, Prefix, f => f.Value); + var settings = context.PartFieldDefinition.GetSettings(); - field.Value = null; + field.Value = null; - if (string.IsNullOrWhiteSpace(viewModel.Value)) + if (string.IsNullOrWhiteSpace(viewModel.Value)) + { + if (settings.Required) { - if (settings.Required) - { - updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["The {0} field is required.", context.PartFieldDefinition.DisplayName()]); - } + updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["The {0} field is required.", context.PartFieldDefinition.DisplayName()]); } - else if (!decimal.TryParse(viewModel.Value, NumberStyles.Any, CultureInfo.CurrentUICulture, out var value)) + } + else if (!decimal.TryParse(viewModel.Value, NumberStyles.Any, CultureInfo.CurrentUICulture, out var value)) + { + updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["{0} is an invalid number.", context.PartFieldDefinition.DisplayName()]); + } + else + { + field.Value = value; + + if (settings.Minimum.HasValue && value < settings.Minimum.Value) { - updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["{0} is an invalid number.", context.PartFieldDefinition.DisplayName()]); + updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["The value must be greater than {0}.", settings.Minimum.Value]); } - else - { - field.Value = value; - if (settings.Minimum.HasValue && value < settings.Minimum.Value) - { - updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["The value must be greater than {0}.", settings.Minimum.Value]); - } + if (settings.Maximum.HasValue && value > settings.Maximum.Value) + { + updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["The value must be less than {0}.", settings.Maximum.Value]); + } - if (settings.Maximum.HasValue && value > settings.Maximum.Value) + // Check the number of decimals. + if (Math.Round(value, settings.Scale) != value) + { + if (settings.Scale == 0) { - updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["The value must be less than {0}.", settings.Maximum.Value]); + updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["The {0} field must be an integer.", context.PartFieldDefinition.DisplayName()]); } - - // Check the number of decimals. - if (Math.Round(value, settings.Scale) != value) + else { - if (settings.Scale == 0) - { - updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["The {0} field must be an integer.", context.PartFieldDefinition.DisplayName()]); - } - else - { - updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["Invalid number of digits for {0}, max allowed: {1}.", context.PartFieldDefinition.DisplayName(), settings.Scale]); - } + updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["Invalid number of digits for {0}, max allowed: {1}.", context.PartFieldDefinition.DisplayName(), settings.Scale]); } } } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/TextFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/TextFieldDisplayDriver.cs index cf8518c535d..08b17228e00 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/TextFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/TextFieldDisplayDriver.cs @@ -47,13 +47,12 @@ public override IDisplayResult Edit(TextField field, BuildFieldEditorContext con public override async Task UpdateAsync(TextField field, IUpdateModel updater, UpdateFieldEditorContext context) { - if (await updater.TryUpdateModelAsync(field, Prefix, f => f.Text)) + await updater.TryUpdateModelAsync(field, Prefix, f => f.Text); + var settings = context.PartFieldDefinition.GetSettings(); + + if (settings.Required && string.IsNullOrWhiteSpace(field.Text)) { - var settings = context.PartFieldDefinition.GetSettings(); - if (settings.Required && string.IsNullOrWhiteSpace(field.Text)) - { - updater.ModelState.AddModelError(Prefix, nameof(field.Text), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); - } + updater.ModelState.AddModelError(Prefix, nameof(field.Text), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); } return Edit(field, context); diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/TimeFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/TimeFieldDisplayDriver.cs index 21029aa74bc..2ab89c28a6f 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/TimeFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/TimeFieldDisplayDriver.cs @@ -46,13 +46,12 @@ public override IDisplayResult Edit(TimeField field, BuildFieldEditorContext con public override async Task UpdateAsync(TimeField field, IUpdateModel updater, UpdateFieldEditorContext context) { - if (await updater.TryUpdateModelAsync(field, Prefix, f => f.Value)) + await updater.TryUpdateModelAsync(field, Prefix, f => f.Value); + var settings = context.PartFieldDefinition.GetSettings(); + + if (settings.Required && field.Value == null) { - var settings = context.PartFieldDefinition.GetSettings(); - if (settings.Required && field.Value == null) - { - updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); - } + updater.ModelState.AddModelError(Prefix, nameof(field.Value), S["A value is required for {0}.", context.PartFieldDefinition.DisplayName()]); } return Edit(field, context); diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/UserPickerFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/UserPickerFieldDisplayDriver.cs index 47a506eef35..65cdfed82b7 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/UserPickerFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/UserPickerFieldDisplayDriver.cs @@ -76,27 +76,25 @@ public override async Task UpdateAsync(UserPickerField field, IU { var viewModel = new EditUserPickerFieldViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix, f => f.UserIds)) - { - field.UserIds = viewModel.UserIds == null - ? [] : viewModel.UserIds.Split(',', StringSplitOptions.RemoveEmptyEntries); + await updater.TryUpdateModelAsync(viewModel, Prefix, f => f.UserIds); + field.UserIds = viewModel.UserIds == null + ? [] : viewModel.UserIds.Split(',', StringSplitOptions.RemoveEmptyEntries); - var settings = context.PartFieldDefinition.GetSettings(); + var settings = context.PartFieldDefinition.GetSettings(); - if (settings.Required && field.UserIds.Length == 0) - { - updater.ModelState.AddModelError(Prefix, nameof(field.UserIds), S["The {0} field is required.", context.PartFieldDefinition.DisplayName()]); - } - - if (!settings.Multiple && field.UserIds.Length > 1) - { - updater.ModelState.AddModelError(Prefix, nameof(field.UserIds), S["The {0} field cannot contain multiple items.", context.PartFieldDefinition.DisplayName()]); - } + if (settings.Required && field.UserIds.Length == 0) + { + updater.ModelState.AddModelError(Prefix, nameof(field.UserIds), S["The {0} field is required.", context.PartFieldDefinition.DisplayName()]); + } - var users = await _session.Query().Where(x => x.UserId.IsIn(field.UserIds)).ListAsync(); - field.SetUserNames(users.Select(t => t.UserName).ToArray()); + if (!settings.Multiple && field.UserIds.Length > 1) + { + updater.ModelState.AddModelError(Prefix, nameof(field.UserIds), S["The {0} field cannot contain multiple items.", context.PartFieldDefinition.DisplayName()]); } + var users = await _session.Query().Where(x => x.UserId.IsIn(field.UserIds)).ListAsync(); + field.SetUserNames(users.Select(t => t.UserName).ToArray()); + return Edit(field, context); } } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/YoutubeFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/YoutubeFieldDisplayDriver.cs index 83bbe74cee3..9113306a016 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/YoutubeFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Drivers/YoutubeFieldDisplayDriver.cs @@ -51,46 +51,45 @@ public override async Task UpdateAsync(YoutubeField field, IUpda { var model = new EditYoutubeFieldViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix)) + await updater.TryUpdateModelAsync(model, Prefix); + var settings = context.PartFieldDefinition.GetSettings(); + + if (settings.Required && string.IsNullOrWhiteSpace(model.RawAddress)) { - var settings = context.PartFieldDefinition.GetSettings(); - if (settings.Required && string.IsNullOrWhiteSpace(model.RawAddress)) - { - updater.ModelState.AddModelError(Prefix, nameof(model.RawAddress), S["A value is required for '{0}'.", context.PartFieldDefinition.DisplayName()]); - } - else + updater.ModelState.AddModelError(Prefix, nameof(model.RawAddress), S["A value is required for '{0}'.", context.PartFieldDefinition.DisplayName()]); + } + else + { + if (model.RawAddress != null) { - if (model.RawAddress != null) - { - var uri = new Uri(model.RawAddress); + var uri = new Uri(model.RawAddress); - // If it is a url with QueryString. - if (!string.IsNullOrWhiteSpace(uri.Query)) + // If it is a url with QueryString. + if (!string.IsNullOrWhiteSpace(uri.Query)) + { + var query = QueryHelpers.ParseQuery(uri.Query); + if (query.TryGetValue("v", out var values)) { - var query = QueryHelpers.ParseQuery(uri.Query); - if (query.TryGetValue("v", out var values)) - { - model.EmbeddedAddress = $"{uri.GetLeftPart(UriPartial.Authority)}/embed/{values}"; - } - else - { - updater.ModelState.AddModelError(Prefix, nameof(model.RawAddress), S["The format of the url is invalid"]); - } + model.EmbeddedAddress = $"{uri.GetLeftPart(UriPartial.Authority)}/embed/{values}"; } else { - var path = uri.AbsolutePath.Split('?')[0]; - model.EmbeddedAddress = $"{uri.GetLeftPart(UriPartial.Authority)}/embed/{path}"; + updater.ModelState.AddModelError(Prefix, nameof(model.RawAddress), S["The format of the url is invalid"]); } - - field.RawAddress = model.RawAddress; - field.EmbeddedAddress = model.EmbeddedAddress; } else { - field.RawAddress = null; - field.EmbeddedAddress = null; + var path = uri.AbsolutePath.Split('?')[0]; + model.EmbeddedAddress = $"{uri.GetLeftPart(UriPartial.Authority)}/embed/{path}"; } + + field.RawAddress = model.RawAddress; + field.EmbeddedAddress = model.EmbeddedAddress; + } + else + { + field.RawAddress = null; + field.EmbeddedAddress = null; } } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/ContentPickerFieldSettingsDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/ContentPickerFieldSettingsDriver.cs index 19cb2705da6..50d4afe674c 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/ContentPickerFieldSettingsDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/ContentPickerFieldSettingsDriver.cs @@ -41,33 +41,32 @@ public override async Task UpdateAsync(ContentPartFieldDefinitio { var model = new ContentPickerFieldSettingsViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) + await context.Updater.TryUpdateModelAsync(model, Prefix); + + var settings = new ContentPickerFieldSettings + { + Hint = model.Hint, + Required = model.Required, + Multiple = model.Multiple, + TitlePattern = model.TitlePattern, + }; + + switch (model.Source) + { + case ContentPickerSettingType.ContentTypes: + SetContentTypes(context.Updater, model.DisplayedContentTypes, settings); + break; + case ContentPickerSettingType.Stereotypes: + SetStereoTypes(context.Updater, model.Stereotypes, settings); + break; + default: + settings.DisplayAllContentTypes = true; + break; + } + + if (IsValidTitlePattern(context, model)) { - var settings = new ContentPickerFieldSettings - { - Hint = model.Hint, - Required = model.Required, - Multiple = model.Multiple, - TitlePattern = model.TitlePattern, - }; - - switch (model.Source) - { - case ContentPickerSettingType.ContentTypes: - SetContentTypes(context.Updater, model.DisplayedContentTypes, settings); - break; - case ContentPickerSettingType.Stereotypes: - SetStereoTypes(context.Updater, model.Stereotypes, settings); - break; - default: - settings.DisplayAllContentTypes = true; - break; - } - - if (IsValidTitlePattern(context, model)) - { - context.Builder.WithSettings(settings); - } + context.Builder.WithSettings(settings); } return Edit(partFieldDefinition); diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/MultiTextFieldSettingsDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/MultiTextFieldSettingsDriver.cs index b39c9d07a0b..a76f09ab480 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/MultiTextFieldSettingsDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/MultiTextFieldSettingsDriver.cs @@ -36,22 +36,22 @@ public override async Task UpdateAsync(ContentPartFieldDefinitio var model = new MultiTextFieldSettingsViewModel(); var settings = new MultiTextFieldSettings(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) + await context.Updater.TryUpdateModelAsync(model, Prefix); + + settings.Required = model.Required; + settings.Hint = model.Hint; + + try { - settings.Required = model.Required; - settings.Hint = model.Hint; - try - { - settings.Options = JConvert.DeserializeObject(model.Options); - } - catch - { - context.Updater.ModelState.AddModelError(Prefix, S["The options are written in an incorrect format."]); - return Edit(partFieldDefinition); - } - - context.Builder.WithSettings(settings); + settings.Options = JConvert.DeserializeObject(model.Options); } + catch + { + context.Updater.ModelState.AddModelError(Prefix, S["The options are written in an incorrect format."]); + return Edit(partFieldDefinition); + } + + context.Builder.WithSettings(settings); return Edit(partFieldDefinition); } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/UserPickerFieldSettingsDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/UserPickerFieldSettingsDriver.cs index 0c5459e3ab1..486f152c18e 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/UserPickerFieldSettingsDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/Settings/UserPickerFieldSettingsDriver.cs @@ -45,31 +45,30 @@ public override async Task UpdateAsync(ContentPartFieldDefinitio { var model = new UserPickerFieldSettingsViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) - { - var settings = new UserPickerFieldSettings - { - Hint = model.Hint, - Required = model.Required, - Multiple = model.Multiple - }; + await context.Updater.TryUpdateModelAsync(model, Prefix); - var selectedRoles = model.Roles.Where(x => x.IsSelected).Select(x => x.Role).ToArray(); + var settings = new UserPickerFieldSettings + { + Hint = model.Hint, + Required = model.Required, + Multiple = model.Multiple + }; - if (model.DisplayAllUsers || selectedRoles.Length == 0) - { - // No selected role should have the same effect as display all users - settings.DisplayedRoles = []; - settings.DisplayAllUsers = true; - } - else - { - settings.DisplayedRoles = selectedRoles; - settings.DisplayAllUsers = false; - } + var selectedRoles = model.Roles.Where(x => x.IsSelected).Select(x => x.Role).ToArray(); - context.Builder.WithSettings(settings); + if (model.DisplayAllUsers || selectedRoles.Length == 0) + { + // No selected role should have the same effect as display all users + settings.DisplayedRoles = []; + settings.DisplayAllUsers = true; } + else + { + settings.DisplayedRoles = selectedRoles; + settings.DisplayAllUsers = false; + } + + context.Builder.WithSettings(settings); return Edit(partFieldDefinition, context.Updater); } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentLocalization/Drivers/LocalizationContentsAdminListDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentLocalization/Drivers/LocalizationContentsAdminListDisplayDriver.cs index 1bbf1455e77..5f06f9dcc4f 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentLocalization/Drivers/LocalizationContentsAdminListDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentLocalization/Drivers/LocalizationContentsAdminListDisplayDriver.cs @@ -52,16 +52,15 @@ public override IDisplayResult Edit(ContentOptionsViewModel model, IUpdateModel public override async Task UpdateAsync(ContentOptionsViewModel model, IUpdateModel updater) { var viewModel = new LocalizationContentsAdminFilterViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, "Localization")) - { - if (viewModel.ShowLocalizedContentTypes) - { - model.RouteValues.TryAdd("Localization.ShowLocalizedContentTypes", viewModel.ShowLocalizedContentTypes); - } + await updater.TryUpdateModelAsync(viewModel, "Localization"); - model.FilterResult.MapFrom(viewModel); + if (viewModel.ShowLocalizedContentTypes) + { + model.RouteValues.TryAdd("Localization.ShowLocalizedContentTypes", viewModel.ShowLocalizedContentTypes); } + model.FilterResult.MapFrom(viewModel); + return Edit(model, updater); } } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentLocalization/Services/LocalizationPartContentsAdminListFilter.cs b/src/OrchardCore.Modules/OrchardCore.ContentLocalization/Services/LocalizationPartContentsAdminListFilter.cs index 2682fd54750..69cc22a8d3b 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentLocalization/Services/LocalizationPartContentsAdminListFilter.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentLocalization/Services/LocalizationPartContentsAdminListFilter.cs @@ -25,20 +25,20 @@ public LocalizationPartContentsAdminListFilter(IContentDefinitionManager content public async Task FilterAsync(ContentOptionsViewModel model, IQuery query, IUpdateModel updater) { var viewModel = new LocalizationContentsAdminFilterViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, "Localization")) + await updater.TryUpdateModelAsync(viewModel, "Localization"); + + // Show localization content items + // This is intended to be used by adding ?Localization.ShowLocalizedContentTypes to an AdminMenu url. + if (viewModel.ShowLocalizedContentTypes) { - // Show localization content items - // This is intended to be used by adding ?Localization.ShowLocalizedContentTypes to an AdminMenu url. - if (viewModel.ShowLocalizedContentTypes) - { - var localizedTypes = (await _contentDefinitionManager.ListTypeDefinitionsAsync()) - .Where(x => - x.Parts.Any(p => - p.PartDefinition.Name == nameof(LocalizationPart))) - .Select(x => x.Name); + var localizedTypes = (await _contentDefinitionManager.ListTypeDefinitionsAsync()) + .Where(x => + x.Parts.Any(p => + p.PartDefinition.Name == nameof(LocalizationPart))) + .Select(x => x.Name); + + query.With(x => x.ContentType.IsIn(localizedTypes)); - query.With(x => x.ContentType.IsIn(localizedTypes)); - } } } } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentTypes/Deployment/DeleteContentDefinitionDeploymentStepDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentTypes/Deployment/DeleteContentDefinitionDeploymentStepDriver.cs index 06d6003beb1..d96a87b949f 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentTypes/Deployment/DeleteContentDefinitionDeploymentStepDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentTypes/Deployment/DeleteContentDefinitionDeploymentStepDriver.cs @@ -34,11 +34,10 @@ public override async Task UpdateAsync(DeleteContentDefinitionDe { var model = new DeleteContentDefinitionStepViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix)) - { - step.ContentTypes = model.ContentTypes.Split(_separator, StringSplitOptions.RemoveEmptyEntries); - step.ContentParts = model.ContentParts.Split(_separator, StringSplitOptions.RemoveEmptyEntries); - } + await updater.TryUpdateModelAsync(model, Prefix); + + step.ContentTypes = model.ContentTypes.Split(_separator, StringSplitOptions.RemoveEmptyEntries); + step.ContentParts = model.ContentParts.Split(_separator, StringSplitOptions.RemoveEmptyEntries); return Edit(step); } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentTypes/Editors/ContentPartSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentTypes/Editors/ContentPartSettingsDisplayDriver.cs index 7c55a5cdfbe..fdadd48d181 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentTypes/Editors/ContentPartSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentTypes/Editors/ContentPartSettingsDisplayDriver.cs @@ -26,13 +26,12 @@ public override async Task UpdateAsync(ContentPartDefinition con { var model = new ContentPartSettingsViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) - { - context.Builder.Attachable(model.Attachable); - context.Builder.Reusable(model.Reusable); - context.Builder.WithDescription(model.Description); - context.Builder.WithDisplayName(model.DisplayName); - } + await context.Updater.TryUpdateModelAsync(model, Prefix); + + context.Builder.Attachable(model.Attachable); + context.Builder.Reusable(model.Reusable); + context.Builder.WithDescription(model.Description); + context.Builder.WithDisplayName(model.DisplayName); return Edit(contentPartDefinition); } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentTypes/Editors/ContentTypeSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.ContentTypes/Editors/ContentTypeSettingsDisplayDriver.cs index 59b19eafbed..e018042578d 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentTypes/Editors/ContentTypeSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentTypes/Editors/ContentTypeSettingsDisplayDriver.cs @@ -37,22 +37,21 @@ public override async Task UpdateAsync(ContentTypeDefinition con { var model = new ContentTypeSettingsViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) - { - context.Builder.Creatable(model.Creatable); - context.Builder.Listable(model.Listable); - context.Builder.Draftable(model.Draftable); - context.Builder.Versionable(model.Versionable); - context.Builder.Securable(model.Securable); - context.Builder.WithDescription(model.Description); + await context.Updater.TryUpdateModelAsync(model, Prefix); + + context.Builder.Creatable(model.Creatable); + context.Builder.Listable(model.Listable); + context.Builder.Draftable(model.Draftable); + context.Builder.Versionable(model.Versionable); + context.Builder.Securable(model.Securable); + context.Builder.WithDescription(model.Description); - var stereotype = model.Stereotype?.Trim(); - context.Builder.Stereotype(stereotype); + var stereotype = model.Stereotype?.Trim(); + context.Builder.Stereotype(stereotype); - if (!IsAlphaNumericOrEmpty(stereotype)) - { - context.Updater.ModelState.AddModelError(nameof(ContentTypeSettingsViewModel.Stereotype), S["The stereotype should be alphanumeric."]); - } + if (!IsAlphaNumericOrEmpty(stereotype)) + { + context.Updater.ModelState.AddModelError(nameof(ContentTypeSettingsViewModel.Stereotype), S["The stereotype should be alphanumeric."]); } return Edit(contentTypeDefinition); diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/AdminNodes/ContentTypesAdminNodeDriver.cs b/src/OrchardCore.Modules/OrchardCore.Contents/AdminNodes/ContentTypesAdminNodeDriver.cs index afc1c7e7e0e..a5ca69a8c6b 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/AdminNodes/ContentTypesAdminNodeDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/AdminNodes/ContentTypesAdminNodeDriver.cs @@ -62,20 +62,19 @@ public override async Task UpdateAsync(ContentTypesAdminNode tre var model = new ContentTypesAdminNodeViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix, x => x.ShowAll, x => x.IconClass, x => x.ContentTypes)) - { - treeNode.ShowAll = model.ShowAll; - treeNode.IconClass = model.IconClass; - treeNode.ContentTypes = model.ContentTypes - .Where(x => x.IsChecked == true) - .Select(x => - new ContentTypeEntry - { - ContentTypeId = x.ContentTypeId, - IconClass = x.IconClass - }) - .ToArray(); - }; + await updater.TryUpdateModelAsync(model, Prefix, x => x.ShowAll, x => x.IconClass, x => x.ContentTypes); + + treeNode.ShowAll = model.ShowAll; + treeNode.IconClass = model.IconClass; + treeNode.ContentTypes = model.ContentTypes + .Where(x => x.IsChecked == true) + .Select(x => + new ContentTypeEntry + { + ContentTypeId = x.ContentTypeId, + IconClass = x.IconClass + }) + .ToArray(); return Edit(treeNode); } diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/AuditTrail/Drivers/AuditTrailPartSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Contents/AuditTrail/Drivers/AuditTrailPartSettingsDisplayDriver.cs index b297dd8834c..1820ae50b94 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/AuditTrail/Drivers/AuditTrailPartSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/AuditTrail/Drivers/AuditTrailPartSettingsDisplayDriver.cs @@ -28,13 +28,12 @@ public override async Task UpdateAsync(ContentTypePartDefinition var viewModel = new AuditTrailPartSettingsViewModel(); - if (await context.Updater.TryUpdateModelAsync(viewModel, Prefix, m => m.ShowCommentInput)) + await context.Updater.TryUpdateModelAsync(viewModel, Prefix, m => m.ShowCommentInput); + + context.Builder.WithSettings(new AuditTrailPartSettings { - context.Builder.WithSettings(new AuditTrailPartSettings - { - ShowCommentInput = viewModel.ShowCommentInput - }); - } + ShowCommentInput = viewModel.ShowCommentInput + }); return Edit(model, context.Updater); } diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Deployment/AddToDeploymentPlan/ContentItemDeploymentStepDriver.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Deployment/AddToDeploymentPlan/ContentItemDeploymentStepDriver.cs index 6d6467296fe..7702de04c89 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Deployment/AddToDeploymentPlan/ContentItemDeploymentStepDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Deployment/AddToDeploymentPlan/ContentItemDeploymentStepDriver.cs @@ -42,17 +42,16 @@ public override async Task UpdateAsync(ContentItemDeploymentStep { var model = new ContentItemDeploymentStepViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix, x => x.ContentItemId)) + await updater.TryUpdateModelAsync(model, Prefix, x => x.ContentItemId); + var contentItem = await _contentManager.GetAsync(model.ContentItemId); + + if (contentItem == null) + { + updater.ModelState.AddModelError(Prefix, nameof(step.ContentItemId), S["Your content item does not exist."]); + } + else { - var contentItem = await _contentManager.GetAsync(model.ContentItemId); - if (contentItem == null) - { - updater.ModelState.AddModelError(Prefix, nameof(step.ContentItemId), S["Your content item does not exist."]); - } - else - { - step.ContentItemId = model.ContentItemId; - } + step.ContentItemId = model.ContentItemId; } return Edit(step); diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Settings/CommonPartSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Settings/CommonPartSettingsDisplayDriver.cs index a79a3382284..9ba96d7fde5 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Settings/CommonPartSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Settings/CommonPartSettingsDisplayDriver.cs @@ -24,10 +24,9 @@ public override async Task UpdateAsync(ContentTypePartDefinition { var model = new CommonPartSettingsViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) - { - context.Builder.WithSettings(new CommonPartSettings { DisplayDateEditor = model.DisplayDateEditor, DisplayOwnerEditor = model.DisplayOwnerEditor }); - } + await context.Updater.TryUpdateModelAsync(model, Prefix); + + context.Builder.WithSettings(new CommonPartSettings { DisplayDateEditor = model.DisplayDateEditor, DisplayOwnerEditor = model.DisplayOwnerEditor }); return Edit(contentTypePartDefinition, context.Updater); } diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Sitemaps/ContentTypesSitemapSourceDriver.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Sitemaps/ContentTypesSitemapSourceDriver.cs index c168a46710f..9f8e146fba3 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Sitemaps/ContentTypesSitemapSourceDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Sitemaps/ContentTypesSitemapSourceDriver.cs @@ -81,7 +81,7 @@ public override async Task UpdateAsync(ContentTypesSitemapSource { var model = new ContentTypesSitemapSourceViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, + await context.Updater.TryUpdateModelAsync(model, Prefix, m => m.IndexAll, m => m.LimitItems, @@ -90,36 +90,35 @@ public override async Task UpdateAsync(ContentTypesSitemapSource m => m.ContentTypes, m => m.LimitedContentTypes, m => m.LimitedContentType - )) - { - sitemap.IndexAll = model.IndexAll; - sitemap.LimitItems = model.LimitItems; - sitemap.Priority = model.Priority; - sitemap.ChangeFrequency = model.ChangeFrequency; - sitemap.ContentTypes = model.ContentTypes - .Where(x => x.IsChecked == true) - .Select(x => new ContentTypeSitemapEntry - { - ContentTypeName = x.ContentTypeName, - ChangeFrequency = x.ChangeFrequency, - Priority = x.Priority, - }) - .ToArray(); + ); - var limitedEntry = model.LimitedContentTypes.FirstOrDefault(lct => string.Equals(lct.ContentTypeName, model.LimitedContentType)); - if (limitedEntry != null) - { - sitemap.LimitedContentType.ContentTypeName = limitedEntry.ContentTypeName; - sitemap.LimitedContentType.ChangeFrequency = limitedEntry.ChangeFrequency; - sitemap.LimitedContentType.Priority = limitedEntry.Priority; - sitemap.LimitedContentType.Skip = limitedEntry.Skip; - sitemap.LimitedContentType.Take = limitedEntry.Take; - } - else + sitemap.IndexAll = model.IndexAll; + sitemap.LimitItems = model.LimitItems; + sitemap.Priority = model.Priority; + sitemap.ChangeFrequency = model.ChangeFrequency; + sitemap.ContentTypes = model.ContentTypes + .Where(x => x.IsChecked == true) + .Select(x => new ContentTypeSitemapEntry { - sitemap.LimitedContentType = new LimitedContentTypeSitemapEntry(); - } - }; + ContentTypeName = x.ContentTypeName, + ChangeFrequency = x.ChangeFrequency, + Priority = x.Priority, + }) + .ToArray(); + + var limitedEntry = model.LimitedContentTypes.FirstOrDefault(lct => string.Equals(lct.ContentTypeName, model.LimitedContentType)); + if (limitedEntry != null) + { + sitemap.LimitedContentType.ContentTypeName = limitedEntry.ContentTypeName; + sitemap.LimitedContentType.ChangeFrequency = limitedEntry.ChangeFrequency; + sitemap.LimitedContentType.Priority = limitedEntry.Priority; + sitemap.LimitedContentType.Skip = limitedEntry.Skip; + sitemap.LimitedContentType.Take = limitedEntry.Take; + } + else + { + sitemap.LimitedContentType = new LimitedContentTypeSitemapEntry(); + } return Edit(sitemap, context.Updater); } diff --git a/src/OrchardCore.Modules/OrchardCore.Contents/Workflows/Drivers/ContentEventDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Contents/Workflows/Drivers/ContentEventDisplayDriver.cs index 74b8883a45f..6b0408f94d2 100644 --- a/src/OrchardCore.Modules/OrchardCore.Contents/Workflows/Drivers/ContentEventDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Contents/Workflows/Drivers/ContentEventDisplayDriver.cs @@ -28,10 +28,10 @@ protected override void EditActivity(TActivity source, TViewModel target) public async override Task UpdateAsync(TActivity model, IUpdateModel updater) { var viewModel = new TViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix, x => x.SelectedContentTypeNames)) - { - model.ContentTypeFilter = (await FilterContentTypesQueryAsync(viewModel.SelectedContentTypeNames)).ToList(); - } + await updater.TryUpdateModelAsync(viewModel, Prefix, x => x.SelectedContentTypeNames); + + model.ContentTypeFilter = (await FilterContentTypesQueryAsync(viewModel.SelectedContentTypeNames)).ToList(); + return Edit(model); } diff --git a/src/OrchardCore.Modules/OrchardCore.Demo/ContentElementDisplays/TestContentElementDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Demo/ContentElementDisplays/TestContentElementDisplayDriver.cs index 0f2e1c7164b..55dbe84d92c 100644 --- a/src/OrchardCore.Modules/OrchardCore.Demo/ContentElementDisplays/TestContentElementDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Demo/ContentElementDisplays/TestContentElementDisplayDriver.cs @@ -68,16 +68,15 @@ public override async Task UpdateAsync(ContentItem contentItem, return null; } - if (await updater.TryUpdateModelAsync(testContentPart, "")) + await updater.TryUpdateModelAsync(testContentPart, ""); + + if (testContentPart.Line.EndsWith(' ')) + { + updater.ModelState.AddModelError(nameof(testContentPart.Line), "Value cannot end with a space"); + } + else { - if (testContentPart.Line.EndsWith(' ')) - { - updater.ModelState.AddModelError(nameof(testContentPart.Line), "Value cannot end with a space"); - } - else - { - contentItem.Apply(testContentPart); - } + contentItem.Apply(testContentPart); } return Copy("TestContentPartA_Edit", testContentPart).Location("Content"); diff --git a/src/OrchardCore.Modules/OrchardCore.Demo/Drivers/UserProfileDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Demo/Drivers/UserProfileDisplayDriver.cs index 2365a6f0a3f..81a6c11623a 100644 --- a/src/OrchardCore.Modules/OrchardCore.Demo/Drivers/UserProfileDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Demo/Drivers/UserProfileDisplayDriver.cs @@ -43,13 +43,12 @@ public override async Task UpdateAsync(UserProfile profile, Buil var model = new EditUserProfileViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) - { - profile.Age = model.Age; - profile.FirstName = model.FirstName; - profile.LastName = model.LastName; - profile.UpdatedAt = DateTime.UtcNow; - } + await context.Updater.TryUpdateModelAsync(model, Prefix); + + profile.Age = model.Age; + profile.FirstName = model.FirstName; + profile.LastName = model.LastName; + profile.UpdatedAt = DateTime.UtcNow; return Edit(profile, context); } diff --git a/src/OrchardCore.Modules/OrchardCore.Deployment/Steps/JsonRecipeDeploymentStepDriver.cs b/src/OrchardCore.Modules/OrchardCore.Deployment/Steps/JsonRecipeDeploymentStepDriver.cs index 6a97cbfa7be..bdcf1c85dae 100644 --- a/src/OrchardCore.Modules/OrchardCore.Deployment/Steps/JsonRecipeDeploymentStepDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Deployment/Steps/JsonRecipeDeploymentStepDriver.cs @@ -60,25 +60,25 @@ public override async Task UpdateAsync(JsonRecipeDeploymentStep { var model = new JsonRecipeDeploymentStepViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix)) + await updater.TryUpdateModelAsync(model, Prefix); + + try { - try + var jObject = JObject.Parse(model.Json); + if (!jObject.ContainsKey("name")) { - var jObject = JObject.Parse(model.Json); - if (!jObject.ContainsKey("name")) - { - - updater.ModelState.AddModelError(Prefix, nameof(JsonRecipeDeploymentStepViewModel.Json), S["The recipe must have a name property"]); - } + updater.ModelState.AddModelError(Prefix, nameof(JsonRecipeDeploymentStepViewModel.Json), S["The recipe must have a name property"]); } - catch (Exception) - { - updater.ModelState.AddModelError(Prefix, nameof(JsonRecipeDeploymentStepViewModel.Json), S["Invalid JSON supplied"]); - } - step.Json = model.Json; } + catch (Exception) + { + updater.ModelState.AddModelError(Prefix, nameof(JsonRecipeDeploymentStepViewModel.Json), S["Invalid JSON supplied"]); + + } + + step.Json = model.Json; return Edit(step); } diff --git a/src/OrchardCore.Modules/OrchardCore.Email.Azure/Drivers/AzureEmailSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Email.Azure/Drivers/AzureEmailSettingsDisplayDriver.cs index e2d5fecd337..93361e82992 100644 --- a/src/OrchardCore.Modules/OrchardCore.Email.Azure/Drivers/AzureEmailSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Email.Azure/Drivers/AzureEmailSettingsDisplayDriver.cs @@ -86,73 +86,72 @@ public override async Task UpdateAsync(ISite site, AzureEmailSet var model = new AzureEmailSettingsViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix)) + await updater.TryUpdateModelAsync(model, Prefix); + + var emailSettings = site.As(); + + var hasChanges = model.IsEnabled != settings.IsEnabled; + + settings.IsEnabled = model.IsEnabled; + + if (!model.IsEnabled) { - var emailSettings = site.As(); + if (hasChanges && emailSettings.DefaultProviderName == AzureEmailProvider.TechnicalName) + { + emailSettings.DefaultProviderName = null; - var hasChanges = model.IsEnabled != settings.IsEnabled; + site.Put(emailSettings); + } + } + else + { + hasChanges |= model.DefaultSender != settings.DefaultSender; - settings.IsEnabled = model.IsEnabled; + if (string.IsNullOrEmpty(model.DefaultSender)) + { + context.Updater.ModelState.AddModelError(Prefix, nameof(model.DefaultSender), S["The Default Sender is a required field."]); + } + else if (!_emailValidator.Validate(model.DefaultSender)) + { + context.Updater.ModelState.AddModelError(Prefix, nameof(model.DefaultSender), S["The Default Sender is invalid."]); + } + + settings.DefaultSender = model.DefaultSender; - if (!model.IsEnabled) + if (string.IsNullOrWhiteSpace(model.ConnectionString) + && settings.ConnectionString is null) { - if (hasChanges && emailSettings.DefaultProviderName == AzureEmailProvider.TechnicalName) - { - emailSettings.DefaultProviderName = null; + context.Updater.ModelState.AddModelError(Prefix, nameof(model.ConnectionString), S["Connection string is required."]); + } + else if (!string.IsNullOrWhiteSpace(model.ConnectionString)) + { + // Encrypt the connection string. + var protector = _dataProtectionProvider.CreateProtector(AzureEmailOptionsConfiguration.ProtectorName); + + var protectedConnection = protector.Protect(model.ConnectionString); - site.Put(emailSettings); - } + // Check if the connection string changed before setting it. + hasChanges |= protectedConnection != settings.ConnectionString; + + settings.ConnectionString = protectedConnection; } - else + } + + if (context.Updater.ModelState.IsValid) + { + if (settings.IsEnabled && string.IsNullOrEmpty(emailSettings.DefaultProviderName)) { - hasChanges |= model.DefaultSender != settings.DefaultSender; - - if (string.IsNullOrEmpty(model.DefaultSender)) - { - context.Updater.ModelState.AddModelError(Prefix, nameof(model.DefaultSender), S["The Default Sender is a required field."]); - } - else if (!_emailValidator.Validate(model.DefaultSender)) - { - context.Updater.ModelState.AddModelError(Prefix, nameof(model.DefaultSender), S["The Default Sender is invalid."]); - } - - settings.DefaultSender = model.DefaultSender; - - if (string.IsNullOrWhiteSpace(model.ConnectionString) - && settings.ConnectionString is null) - { - context.Updater.ModelState.AddModelError(Prefix, nameof(model.ConnectionString), S["Connection string is required."]); - } - else if (!string.IsNullOrWhiteSpace(model.ConnectionString)) - { - // Encrypt the connection string. - var protector = _dataProtectionProvider.CreateProtector(AzureEmailOptionsConfiguration.ProtectorName); - - var protectedConnection = protector.Protect(model.ConnectionString); - - // Check if the connection string changed before setting it. - hasChanges |= protectedConnection != settings.ConnectionString; - - settings.ConnectionString = protectedConnection; - } + // If we are enabling the only provider, set it as the default one. + emailSettings.DefaultProviderName = AzureEmailProvider.TechnicalName; + site.Put(emailSettings); + + hasChanges = true; } - if (context.Updater.ModelState.IsValid) + if (hasChanges) { - if (settings.IsEnabled && string.IsNullOrEmpty(emailSettings.DefaultProviderName)) - { - // If we are enabling the only provider, set it as the default one. - emailSettings.DefaultProviderName = AzureEmailProvider.TechnicalName; - site.Put(emailSettings); - - hasChanges = true; - } - - if (hasChanges) - { - // Release the tenant to apply the settings when something changed. - await _shellHost.ReleaseShellContextAsync(_shellSettings); - } + // Release the tenant to apply the settings when something changed. + await _shellHost.ReleaseShellContextAsync(_shellSettings); } } diff --git a/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Drivers/SmtpSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Drivers/SmtpSettingsDisplayDriver.cs index decc75f2aaa..277e0b53789 100644 --- a/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Drivers/SmtpSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Email.Smtp/Drivers/SmtpSettingsDisplayDriver.cs @@ -104,105 +104,104 @@ public override async Task UpdateAsync(ISite site, SmtpSettings var model = new SmtpSettingsViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) + await context.Updater.TryUpdateModelAsync(model, Prefix); + + var emailSettings = site.As(); + + var hasChanges = model.IsEnabled != settings.IsEnabled; + + if (!model.IsEnabled) { - var emailSettings = site.As(); + if (hasChanges && emailSettings.DefaultProviderName == SmtpEmailProvider.TechnicalName) + { + emailSettings.DefaultProviderName = null; - var hasChanges = model.IsEnabled != settings.IsEnabled; + site.Put(emailSettings); + } - if (!model.IsEnabled) + settings.IsEnabled = false; + } + else + { + if (string.IsNullOrEmpty(model.DefaultSender)) + { + context.Updater.ModelState.AddModelError(Prefix, nameof(model.DefaultSender), S["The Default Sender is a required field."]); + } + else if (!_emailValidator.Validate(model.DefaultSender)) { - if (hasChanges && emailSettings.DefaultProviderName == SmtpEmailProvider.TechnicalName) - { - emailSettings.DefaultProviderName = null; + context.Updater.ModelState.AddModelError(Prefix, nameof(model.DefaultSender), S["The Default Sender is invalid."]); + } - site.Put(emailSettings); - } + if (model.DeliveryMethod == SmtpDeliveryMethod.Network + && string.IsNullOrWhiteSpace(model.Host)) + { + updater.ModelState.AddModelError(Prefix, nameof(model.Host), S["The {0} field is required.", "Host name"]); + } + else if (model.DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory + && string.IsNullOrWhiteSpace(model.PickupDirectoryLocation)) + { + updater.ModelState.AddModelError(Prefix, nameof(model.PickupDirectoryLocation), S["The {0} field is required.", "Pickup directory location"]); + } + + hasChanges |= model.DefaultSender != settings.DefaultSender; + hasChanges |= model.Host != settings.Host; + hasChanges |= model.Port != settings.Port; + hasChanges |= model.AutoSelectEncryption != settings.AutoSelectEncryption; + hasChanges |= model.RequireCredentials != settings.RequireCredentials; + hasChanges |= model.UseDefaultCredentials != settings.UseDefaultCredentials; + hasChanges |= model.EncryptionMethod != settings.EncryptionMethod; + hasChanges |= model.UserName != settings.UserName; + hasChanges |= model.ProxyHost != settings.ProxyHost; + hasChanges |= model.ProxyPort != settings.ProxyPort; + hasChanges |= model.IgnoreInvalidSslCertificate != settings.IgnoreInvalidSslCertificate; + hasChanges |= model.DeliveryMethod != settings.DeliveryMethod; + hasChanges |= model.PickupDirectoryLocation != settings.PickupDirectoryLocation; + + // Store the password when there is a new value. + if (!string.IsNullOrWhiteSpace(model.Password)) + { + // Encrypt the password. + var protector = _dataProtectionProvider.CreateProtector(SmtpOptionsConfiguration.ProtectorName); + + var protectedPassword = protector.Protect(model.Password); + + // Check if the password changed before setting the password. + hasChanges |= protectedPassword != settings.Password; - settings.IsEnabled = false; + settings.Password = protectedPassword; } - else + + settings.IsEnabled = true; + settings.DefaultSender = model.DefaultSender; + settings.Host = model.Host; + settings.Port = model.Port; + settings.AutoSelectEncryption = model.AutoSelectEncryption; + settings.RequireCredentials = model.RequireCredentials; + settings.UseDefaultCredentials = model.UseDefaultCredentials; + settings.EncryptionMethod = model.EncryptionMethod; + settings.UserName = model.UserName; + settings.ProxyHost = model.ProxyHost; + settings.ProxyPort = model.ProxyPort; + settings.IgnoreInvalidSslCertificate = model.IgnoreInvalidSslCertificate; + settings.DeliveryMethod = model.DeliveryMethod; + settings.PickupDirectoryLocation = model.PickupDirectoryLocation; + } + + if (context.Updater.ModelState.IsValid) + { + if (settings.IsEnabled == true && string.IsNullOrEmpty(emailSettings.DefaultProviderName)) { - if (string.IsNullOrEmpty(model.DefaultSender)) - { - context.Updater.ModelState.AddModelError(Prefix, nameof(model.DefaultSender), S["The Default Sender is a required field."]); - } - else if (!_emailValidator.Validate(model.DefaultSender)) - { - context.Updater.ModelState.AddModelError(Prefix, nameof(model.DefaultSender), S["The Default Sender is invalid."]); - } - - if (model.DeliveryMethod == SmtpDeliveryMethod.Network - && string.IsNullOrWhiteSpace(model.Host)) - { - updater.ModelState.AddModelError(Prefix, nameof(model.Host), S["The {0} field is required.", "Host name"]); - } - else if (model.DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory - && string.IsNullOrWhiteSpace(model.PickupDirectoryLocation)) - { - updater.ModelState.AddModelError(Prefix, nameof(model.PickupDirectoryLocation), S["The {0} field is required.", "Pickup directory location"]); - } - - hasChanges |= model.DefaultSender != settings.DefaultSender; - hasChanges |= model.Host != settings.Host; - hasChanges |= model.Port != settings.Port; - hasChanges |= model.AutoSelectEncryption != settings.AutoSelectEncryption; - hasChanges |= model.RequireCredentials != settings.RequireCredentials; - hasChanges |= model.UseDefaultCredentials != settings.UseDefaultCredentials; - hasChanges |= model.EncryptionMethod != settings.EncryptionMethod; - hasChanges |= model.UserName != settings.UserName; - hasChanges |= model.ProxyHost != settings.ProxyHost; - hasChanges |= model.ProxyPort != settings.ProxyPort; - hasChanges |= model.IgnoreInvalidSslCertificate != settings.IgnoreInvalidSslCertificate; - hasChanges |= model.DeliveryMethod != settings.DeliveryMethod; - hasChanges |= model.PickupDirectoryLocation != settings.PickupDirectoryLocation; - - // Store the password when there is a new value. - if (!string.IsNullOrWhiteSpace(model.Password)) - { - // Encrypt the password. - var protector = _dataProtectionProvider.CreateProtector(SmtpOptionsConfiguration.ProtectorName); - - var protectedPassword = protector.Protect(model.Password); - - // Check if the password changed before setting the password. - hasChanges |= protectedPassword != settings.Password; - - settings.Password = protectedPassword; - } - - settings.IsEnabled = true; - settings.DefaultSender = model.DefaultSender; - settings.Host = model.Host; - settings.Port = model.Port; - settings.AutoSelectEncryption = model.AutoSelectEncryption; - settings.RequireCredentials = model.RequireCredentials; - settings.UseDefaultCredentials = model.UseDefaultCredentials; - settings.EncryptionMethod = model.EncryptionMethod; - settings.UserName = model.UserName; - settings.ProxyHost = model.ProxyHost; - settings.ProxyPort = model.ProxyPort; - settings.IgnoreInvalidSslCertificate = model.IgnoreInvalidSslCertificate; - settings.DeliveryMethod = model.DeliveryMethod; - settings.PickupDirectoryLocation = model.PickupDirectoryLocation; + // If we are enabling the only provider, set it as the default one. + emailSettings.DefaultProviderName = SmtpEmailProvider.TechnicalName; + site.Put(emailSettings); + + hasChanges = true; } - if (context.Updater.ModelState.IsValid) + if (hasChanges) { - if (settings.IsEnabled == true && string.IsNullOrEmpty(emailSettings.DefaultProviderName)) - { - // If we are enabling the only provider, set it as the default one. - emailSettings.DefaultProviderName = SmtpEmailProvider.TechnicalName; - site.Put(emailSettings); - - hasChanges = true; - } - - if (hasChanges) - { - // Release the tenant to apply the settings when something changed. - await _shellHost.ReleaseShellContextAsync(_shellSettings); - } + // Release the tenant to apply the settings when something changed. + await _shellHost.ReleaseShellContextAsync(_shellSettings); } } diff --git a/src/OrchardCore.Modules/OrchardCore.Email/Drivers/EmailSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Email/Drivers/EmailSettingsDisplayDriver.cs index b471f4b469a..cec6b0042b5 100644 --- a/src/OrchardCore.Modules/OrchardCore.Email/Drivers/EmailSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Email/Drivers/EmailSettingsDisplayDriver.cs @@ -85,14 +85,13 @@ public override async Task UpdateAsync(EmailSettings settings, B var model = new EmailSettingsViewModel(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) + await context.Updater.TryUpdateModelAsync(model, Prefix); + + if (settings.DefaultProviderName != model.DefaultProvider) { - if (settings.DefaultProviderName != model.DefaultProvider) - { - settings.DefaultProviderName = model.DefaultProvider; + settings.DefaultProviderName = model.DefaultProvider; - await _shellHost.ReleaseShellContextAsync(_shellSettings); - } + await _shellHost.ReleaseShellContextAsync(_shellSettings); } return await EditAsync(settings, context); diff --git a/src/OrchardCore.Modules/OrchardCore.Facebook/Widgets/Drivers/FacebookPluginPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Facebook/Widgets/Drivers/FacebookPluginPartDisplayDriver.cs index 8cea82e4707..0eee3f0c1e7 100644 --- a/src/OrchardCore.Modules/OrchardCore.Facebook/Widgets/Drivers/FacebookPluginPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Facebook/Widgets/Drivers/FacebookPluginPartDisplayDriver.cs @@ -73,16 +73,15 @@ public override async Task UpdateAsync(FacebookPluginPart model, { var viewModel = new FacebookPluginPartViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Liquid)) + await updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Liquid); + + if (!string.IsNullOrEmpty(viewModel.Liquid) && !_liquidTemplateManager.Validate(viewModel.Liquid, out var errors)) + { + updater.ModelState.AddModelError(nameof(model.Liquid), S["The FaceBook Body doesn't contain a valid Liquid expression. Details: {0}", string.Join(" ", errors)]); + } + else { - if (!string.IsNullOrEmpty(viewModel.Liquid) && !_liquidTemplateManager.Validate(viewModel.Liquid, out var errors)) - { - updater.ModelState.AddModelError(nameof(model.Liquid), S["The FaceBook Body doesn't contain a valid Liquid expression. Details: {0}", string.Join(" ", errors)]); - } - else - { - model.Liquid = viewModel.Liquid; - } + model.Liquid = viewModel.Liquid; } return Edit(model); diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ButtonPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ButtonPartDisplayDriver.cs index 07222857eca..249478db06e 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ButtonPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ButtonPartDisplayDriver.cs @@ -27,11 +27,10 @@ public async override Task UpdateAsync(ButtonPart part, IUpdateM { var viewModel = new ButtonPartEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - part.Text = viewModel.Text?.Trim(); - part.Type = viewModel.Type?.Trim(); - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + + part.Text = viewModel.Text?.Trim(); + part.Type = viewModel.Type?.Trim(); return Edit(part); } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementLabelPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementLabelPartDisplayDriver.cs index b525bb75750..5eabf67e38e 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementLabelPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementLabelPartDisplayDriver.cs @@ -27,11 +27,10 @@ public async override Task UpdateAsync(FormElementLabelPart part { var viewModel = new FormElementLabelPartViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - part.Label = viewModel.Label; - part.Option = viewModel.LabelOption; - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + + part.Label = viewModel.Label; + part.Option = viewModel.LabelOption; return Edit(part); } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementPartDisplayDriver.cs index e2399cf8a27..a1002dd40ef 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementPartDisplayDriver.cs @@ -21,10 +21,9 @@ public async override Task UpdateAsync(FormElementPart part, IUp { var viewModel = new FormElementPartEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - part.Id = viewModel.Id?.Trim(); - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + + part.Id = viewModel.Id?.Trim(); return Edit(part); } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementValidationPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementValidationPartDisplayDriver.cs index aa8b227e548..633ed5d68c9 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementValidationPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormElementValidationPartDisplayDriver.cs @@ -26,10 +26,9 @@ public async override Task UpdateAsync(FormElementValidationPart { var viewModel = new FormElementValidationPartViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - part.Option = viewModel.ValidationOption; - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + + part.Option = viewModel.ValidationOption; return Edit(part); } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormInputElementPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormInputElementPartDisplayDriver.cs index eb689235623..73b8f1ee3f6 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormInputElementPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormInputElementPartDisplayDriver.cs @@ -30,17 +30,16 @@ public async override Task UpdateAsync(FormInputElementPart part { var viewModel = new FormInputElementPartEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - if (string.IsNullOrWhiteSpace(viewModel.Name)) - { - updater.ModelState.AddModelError(Prefix, nameof(viewModel.Name), S["A value is required for Name."]); - } + await updater.TryUpdateModelAsync(viewModel, Prefix); - part.Name = viewModel.Name?.Trim(); - part.ContentItem.DisplayText = part.Name; + if (string.IsNullOrWhiteSpace(viewModel.Name)) + { + updater.ModelState.AddModelError(Prefix, nameof(viewModel.Name), S["A value is required for Name."]); } + part.Name = viewModel.Name?.Trim(); + part.ContentItem.DisplayText = part.Name; + return Edit(part); } } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormPartDisplayDriver.cs index 3816418a7dd..87c0106e607 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/FormPartDisplayDriver.cs @@ -26,15 +26,14 @@ public async override Task UpdateAsync(FormPart part, IUpdateMod { var viewModel = new FormPartEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - part.Action = viewModel.Action?.Trim(); - part.Method = viewModel.Method; - part.WorkflowTypeId = viewModel.WorkflowTypeId; - part.EncType = viewModel.EncType; - part.EnableAntiForgeryToken = viewModel.EnableAntiForgeryToken; - part.SaveFormLocation = viewModel.SaveFormLocation; - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + + part.Action = viewModel.Action?.Trim(); + part.Method = viewModel.Method; + part.WorkflowTypeId = viewModel.WorkflowTypeId; + part.EncType = viewModel.EncType; + part.EnableAntiForgeryToken = viewModel.EnableAntiForgeryToken; + part.SaveFormLocation = viewModel.SaveFormLocation; return Edit(part); } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/InputPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/InputPartDisplayDriver.cs index cd3577d3107..7940eb1c8be 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/InputPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/InputPartDisplayDriver.cs @@ -28,12 +28,11 @@ public async override Task UpdateAsync(InputPart part, IUpdateMo { var viewModel = new InputPartEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - part.Placeholder = viewModel.Placeholder?.Trim(); - part.DefaultValue = viewModel.DefaultValue?.Trim(); - part.Type = viewModel.Type?.Trim(); - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + + part.Placeholder = viewModel.Placeholder?.Trim(); + part.DefaultValue = viewModel.DefaultValue?.Trim(); + part.Type = viewModel.Type?.Trim(); return Edit(part); } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/LabelPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/LabelPartDisplayDriver.cs index 23cfe8d49a9..9d00c483247 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/LabelPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/LabelPartDisplayDriver.cs @@ -27,10 +27,9 @@ public override async Task UpdateAsync(LabelPart part, IUpdateMo { var viewModel = new LabelPartEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - part.For = viewModel.For?.Trim(); - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + + part.For = viewModel.For?.Trim(); return Edit(part, context); } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/SelectPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/SelectPartDisplayDriver.cs index aed21a58a3e..3c7896a713d 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/SelectPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/SelectPartDisplayDriver.cs @@ -37,20 +37,19 @@ public async override Task UpdateAsync(SelectPart part, IUpdateM { var viewModel = new SelectPartEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { + await updater.TryUpdateModelAsync(viewModel, Prefix)l + part.DefaultValue = viewModel.DefaultValue; - try - { - part.Editor = viewModel.Editor; - part.Options = string.IsNullOrWhiteSpace(viewModel.Options) - ? [] - : JConvert.DeserializeObject(viewModel.Options); - } - catch - { - updater.ModelState.AddModelError(Prefix + '.' + nameof(SelectPartEditViewModel.Options), S["The options are written in an incorrect format."]); - } + try + { + part.Editor = viewModel.Editor; + part.Options = string.IsNullOrWhiteSpace(viewModel.Options) + ? [] + : JConvert.DeserializeObject(viewModel.Options); + } + catch + { + updater.ModelState.AddModelError(Prefix + '.' + nameof(SelectPartEditViewModel.Options), S["The options are written in an incorrect format."]); } return Edit(part); diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/TextAreaPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/TextAreaPartDisplayDriver.cs index bf297e440a8..9a196fe3e9c 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/TextAreaPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/TextAreaPartDisplayDriver.cs @@ -27,11 +27,10 @@ public async override Task UpdateAsync(TextAreaPart part, IUpdat { var viewModel = new InputPartEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - part.Placeholder = viewModel.Placeholder?.Trim(); - part.DefaultValue = viewModel.DefaultValue?.Trim(); - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + + part.Placeholder = viewModel.Placeholder?.Trim(); + part.DefaultValue = viewModel.DefaultValue?.Trim(); return Edit(part); } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ValidationPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ValidationPartDisplayDriver.cs index e9b12c46cf1..1212dbb675c 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ValidationPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ValidationPartDisplayDriver.cs @@ -26,10 +26,9 @@ public async override Task UpdateAsync(ValidationPart part, IUpd { var viewModel = new ValidationPartEditViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix)) - { - part.For = viewModel.For?.Trim(); - } + await updater.TryUpdateModelAsync(viewModel, Prefix); + + part.For = viewModel.For?.Trim(); return Edit(part); } diff --git a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ValidationSummaryPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ValidationSummaryPartDisplayDriver.cs index 757d78e16e8..eaff9bf2f59 100644 --- a/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ValidationSummaryPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Forms/Drivers/ValidationSummaryPartDisplayDriver.cs @@ -27,10 +27,9 @@ public override async Task UpdateAsync(ValidationSummaryPart par { var model = new ValidationSummaryViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix)) - { - part.ModelOnly = model.ModelOnly; - } + await updater.TryUpdateModelAsync(model, Prefix); + + part.ModelOnly = model.ModelOnly; return Edit(part); } diff --git a/src/OrchardCore.Modules/OrchardCore.Html/Drivers/HtmlBodyPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Html/Drivers/HtmlBodyPartDisplayDriver.cs index dfe53cdbf94..71d962427ce 100644 --- a/src/OrchardCore.Modules/OrchardCore.Html/Drivers/HtmlBodyPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Html/Drivers/HtmlBodyPartDisplayDriver.cs @@ -64,17 +64,16 @@ public override async Task UpdateAsync(HtmlBodyPart model, IUpda var settings = context.TypePartDefinition.GetSettings(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Html)) + await updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Html); + + if (!string.IsNullOrEmpty(viewModel.Html) && !_liquidTemplateManager.Validate(viewModel.Html, out var errors)) { - if (!string.IsNullOrEmpty(viewModel.Html) && !_liquidTemplateManager.Validate(viewModel.Html, out var errors)) - { - var partName = context.TypePartDefinition.DisplayName(); - updater.ModelState.AddModelError(Prefix, nameof(viewModel.Html), S["{0} doesn't contain a valid Liquid expression. Details: {1}", partName, string.Join(" ", errors)]); - } - else - { - model.Html = settings.SanitizeHtml ? _htmlSanitizerService.Sanitize(viewModel.Html) : viewModel.Html; - } + var partName = context.TypePartDefinition.DisplayName(); + updater.ModelState.AddModelError(Prefix, nameof(viewModel.Html), S["{0} doesn't contain a valid Liquid expression. Details: {1}", partName, string.Join(" ", errors)]); + } + else + { + model.Html = settings.SanitizeHtml ? _htmlSanitizerService.Sanitize(viewModel.Html) : viewModel.Html; } return Edit(model, context); diff --git a/src/OrchardCore.Modules/OrchardCore.Html/Settings/HtmlBodyPartSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Html/Settings/HtmlBodyPartSettingsDisplayDriver.cs index f5e3902f4b1..2bd69738a5f 100644 --- a/src/OrchardCore.Modules/OrchardCore.Html/Settings/HtmlBodyPartSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Html/Settings/HtmlBodyPartSettingsDisplayDriver.cs @@ -26,12 +26,11 @@ public override async Task UpdateAsync(ContentTypePartDefinition var model = new HtmlBodyPartSettingsViewModel(); var settings = new HtmlBodyPartSettings(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) - { - settings.SanitizeHtml = model.SanitizeHtml; + await context.Updater.TryUpdateModelAsync(model, Prefix); + + settings.SanitizeHtml = model.SanitizeHtml; - context.Builder.WithSettings(settings); - } + context.Builder.WithSettings(settings); return Edit(contentTypePartDefinition, context.Updater); } diff --git a/src/OrchardCore.Modules/OrchardCore.Layers/Drivers/LayerMetadataWelder.cs b/src/OrchardCore.Modules/OrchardCore.Layers/Drivers/LayerMetadataWelder.cs index 572d02797e2..eebbf7a4963 100644 --- a/src/OrchardCore.Modules/OrchardCore.Layers/Drivers/LayerMetadataWelder.cs +++ b/src/OrchardCore.Modules/OrchardCore.Layers/Drivers/LayerMetadataWelder.cs @@ -38,10 +38,10 @@ public override async Task EditAsync(ContentItem model, BuildEdi if (layerMetadata == null) { layerMetadata = new LayerMetadata(); + await context.Updater.TryUpdateModelAsync(layerMetadata, Prefix, m => m.Zone, m => m.Position); // Are we loading an editor that requires layer metadata? - if (await context.Updater.TryUpdateModelAsync(layerMetadata, Prefix, m => m.Zone, m => m.Position) - && !string.IsNullOrEmpty(layerMetadata.Zone)) + if (!string.IsNullOrEmpty(layerMetadata.Zone)) { model.Weld(layerMetadata); } diff --git a/src/OrchardCore.Modules/OrchardCore.Liquid/Drivers/LiquidPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Liquid/Drivers/LiquidPartDisplayDriver.cs index ee03e39ef6c..c033547ff8a 100644 --- a/src/OrchardCore.Modules/OrchardCore.Liquid/Drivers/LiquidPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Liquid/Drivers/LiquidPartDisplayDriver.cs @@ -39,16 +39,15 @@ public override async Task UpdateAsync(LiquidPart model, IUpdate { var viewModel = new LiquidPartViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Liquid)) + await updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Liquid); + + if (!string.IsNullOrEmpty(viewModel.Liquid) && !_liquidTemplatemanager.Validate(viewModel.Liquid, out var errors)) + { + updater.ModelState.AddModelError(Prefix, nameof(viewModel.Liquid), S["The Liquid Body doesn't contain a valid Liquid expression. Details: {0}", string.Join(" ", errors)]); + } + else { - if (!string.IsNullOrEmpty(viewModel.Liquid) && !_liquidTemplatemanager.Validate(viewModel.Liquid, out var errors)) - { - updater.ModelState.AddModelError(Prefix, nameof(viewModel.Liquid), S["The Liquid Body doesn't contain a valid Liquid expression. Details: {0}", string.Join(" ", errors)]); - } - else - { - model.Liquid = viewModel.Liquid; - } + model.Liquid = viewModel.Liquid; } return Edit(model); diff --git a/src/OrchardCore.Modules/OrchardCore.Lists/AdminNodes/ListsAdminNodeDriver.cs b/src/OrchardCore.Modules/OrchardCore.Lists/AdminNodes/ListsAdminNodeDriver.cs index f476ba23a3c..26c8c2ab24f 100644 --- a/src/OrchardCore.Modules/OrchardCore.Lists/AdminNodes/ListsAdminNodeDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Lists/AdminNodes/ListsAdminNodeDriver.cs @@ -45,15 +45,14 @@ public override async Task UpdateAsync(ListsAdminNode treeNode, { var model = new ListsAdminNodeViewModel(); - if (await updater.TryUpdateModelAsync(model, Prefix, + await updater.TryUpdateModelAsync(model, Prefix, x => x.ContentType, x => x.IconForContentItems, - x => x.AddContentTypeAsParent, x => x.IconForParentLink)) - { - treeNode.ContentType = model.ContentType; - treeNode.IconForContentItems = model.IconForContentItems; - treeNode.AddContentTypeAsParent = model.AddContentTypeAsParent; - treeNode.IconForParentLink = model.IconForParentLink; - }; + x => x.AddContentTypeAsParent, x => x.IconForParentLink); + + treeNode.ContentType = model.ContentType; + treeNode.IconForContentItems = model.IconForContentItems; + treeNode.AddContentTypeAsParent = model.AddContentTypeAsParent; + treeNode.IconForParentLink = model.IconForParentLink; return Edit(treeNode); } diff --git a/src/OrchardCore.Modules/OrchardCore.Lists/Drivers/ContainedPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Lists/Drivers/ContainedPartDisplayDriver.cs index 07da41aad2c..c5c38832c06 100644 --- a/src/OrchardCore.Modules/OrchardCore.Lists/Drivers/ContainedPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Lists/Drivers/ContainedPartDisplayDriver.cs @@ -44,10 +44,9 @@ public override async Task EditAsync(ContentItem model, IUpdateM } var viewModel = new EditContainedPartViewModel(); + await updater.TryUpdateModelAsync(viewModel, nameof(ListPart)); - if (await updater.TryUpdateModelAsync(viewModel, nameof(ListPart)) - && viewModel.ContainerId != null - && viewModel.ContentType == model.ContentType) + if (viewModel.ContainerId != null && viewModel.ContentType == model.ContentType) { // We are creating a content item that needs to be added to a container. // Render the container id as part of the form. The content type, and the enable ordering setting. @@ -74,12 +73,11 @@ await model.AlterAsync(async part => public override async Task UpdateAsync(ContentItem model, IUpdateModel updater) { var viewModel = new EditContainedPartViewModel(); + await updater.TryUpdateModelAsync(viewModel, nameof(ListPart)); // The content type must match the value provided in the query string // in order for the ContainedPart to be included on the Content Item. - if (await updater.TryUpdateModelAsync(viewModel, nameof(ListPart)) - && viewModel.ContainerId != null - && viewModel.ContentType == model.ContentType) + if (viewModel.ContainerId != null && viewModel.ContentType == model.ContentType) { await model.AlterAsync(async part => { diff --git a/src/OrchardCore.Modules/OrchardCore.Lists/Drivers/ListPartContentsAdminListDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Lists/Drivers/ListPartContentsAdminListDisplayDriver.cs index 6b2e84a140c..4e481bd6de0 100644 --- a/src/OrchardCore.Modules/OrchardCore.Lists/Drivers/ListPartContentsAdminListDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Lists/Drivers/ListPartContentsAdminListDisplayDriver.cs @@ -23,17 +23,16 @@ public override IDisplayResult Edit(ContentOptionsViewModel model, IUpdateModel public override async Task UpdateAsync(ContentOptionsViewModel model, IUpdateModel updater) { var viewModel = new ListPartContentsAdminFilterViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, nameof(ListPart))) + await updater.TryUpdateModelAsync(viewModel, nameof(ListPart)); + + if (viewModel.ShowListContentTypes) { - if (viewModel.ShowListContentTypes) - { - model.RouteValues.TryAdd("ListPart.ShowListContentTypes", viewModel.ShowListContentTypes); - } + model.RouteValues.TryAdd("ListPart.ShowListContentTypes", viewModel.ShowListContentTypes); + } - if (!string.IsNullOrEmpty(viewModel.ListContentItemId)) - { - model.RouteValues.TryAdd("ListPart.ListContentItemId", viewModel.ListContentItemId); - } + if (!string.IsNullOrEmpty(viewModel.ListContentItemId)) + { + model.RouteValues.TryAdd("ListPart.ListContentItemId", viewModel.ListContentItemId); } return Edit(model, updater); diff --git a/src/OrchardCore.Modules/OrchardCore.Lists/Services/ListPartContentsAdminListFilter.cs b/src/OrchardCore.Modules/OrchardCore.Lists/Services/ListPartContentsAdminListFilter.cs index 09fe7b0601e..91e4c3f05d8 100644 --- a/src/OrchardCore.Modules/OrchardCore.Lists/Services/ListPartContentsAdminListFilter.cs +++ b/src/OrchardCore.Modules/OrchardCore.Lists/Services/ListPartContentsAdminListFilter.cs @@ -26,25 +26,24 @@ public ListPartContentsAdminListFilter(IContentDefinitionManager contentDefiniti public async Task FilterAsync(ContentOptionsViewModel model, IQuery query, IUpdateModel updater) { var viewModel = new ListPartContentsAdminFilterViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, nameof(ListPart))) + await updater.TryUpdateModelAsync(viewModel, nameof(ListPart)); + + // Show list content items + if (viewModel.ShowListContentTypes) { - // Show list content items - if (viewModel.ShowListContentTypes) - { - var listableTypes = (await _contentDefinitionManager.ListTypeDefinitionsAsync()) - .Where(x => - x.Parts.Any(p => - p.PartDefinition.Name == nameof(ListPart))) - .Select(x => x.Name); + var listableTypes = (await _contentDefinitionManager.ListTypeDefinitionsAsync()) + .Where(x => + x.Parts.Any(p => + p.PartDefinition.Name == nameof(ListPart))) + .Select(x => x.Name); - query.With(x => x.ContentType.IsIn(listableTypes)); - } + query.With(x => x.ContentType.IsIn(listableTypes)); + } - // Show contained elements for the specified list - else if (viewModel.ListContentItemId != null) - { - query.With(x => x.ListContentItemId == viewModel.ListContentItemId); - } + // Show contained elements for the specified list + else if (viewModel.ListContentItemId != null) + { + query.With(x => x.ListContentItemId == viewModel.ListContentItemId); } } } diff --git a/src/OrchardCore.Modules/OrchardCore.Markdown/Drivers/MarkdownBodyPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Markdown/Drivers/MarkdownBodyPartDisplayDriver.cs index 95acec8ad01..4b168f9ea47 100644 --- a/src/OrchardCore.Modules/OrchardCore.Markdown/Drivers/MarkdownBodyPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Markdown/Drivers/MarkdownBodyPartDisplayDriver.cs @@ -66,17 +66,16 @@ public override async Task UpdateAsync(MarkdownBodyPart model, I { var viewModel = new MarkdownBodyPartViewModel(); - if (await context.Updater.TryUpdateModelAsync(viewModel, Prefix, vm => vm.Markdown)) + await context.Updater.TryUpdateModelAsync(viewModel, Prefix, vm => vm.Markdown); + + if (!string.IsNullOrEmpty(viewModel.Markdown) && !_liquidTemplateManager.Validate(viewModel.Markdown, out var errors)) { - if (!string.IsNullOrEmpty(viewModel.Markdown) && !_liquidTemplateManager.Validate(viewModel.Markdown, out var errors)) - { - var partName = context.TypePartDefinition.DisplayName(); - updater.ModelState.AddModelError(Prefix, nameof(viewModel.Markdown), S["{0} doesn't contain a valid Liquid expression. Details: {1}", partName, string.Join(" ", errors)]); - } - else - { - model.Markdown = viewModel.Markdown; - } + var partName = context.TypePartDefinition.DisplayName(); + updater.ModelState.AddModelError(Prefix, nameof(viewModel.Markdown), S["{0} doesn't contain a valid Liquid expression. Details: {1}", partName, string.Join(" ", errors)]); + } + else + { + model.Markdown = viewModel.Markdown; } return Edit(model, context); diff --git a/src/OrchardCore.Modules/OrchardCore.Markdown/Drivers/MarkdownFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Markdown/Drivers/MarkdownFieldDisplayDriver.cs index c5062afbe04..ec1c4060ea9 100644 --- a/src/OrchardCore.Modules/OrchardCore.Markdown/Drivers/MarkdownFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Markdown/Drivers/MarkdownFieldDisplayDriver.cs @@ -97,17 +97,16 @@ public override async Task UpdateAsync(MarkdownField field, IUpd { var viewModel = new EditMarkdownFieldViewModel(); - if (await updater.TryUpdateModelAsync(viewModel, Prefix, vm => vm.Markdown)) + await updater.TryUpdateModelAsync(viewModel, Prefix, vm => vm.Markdown); + + if (!string.IsNullOrEmpty(viewModel.Markdown) && !_liquidTemplateManager.Validate(viewModel.Markdown, out var errors)) { - if (!string.IsNullOrEmpty(viewModel.Markdown) && !_liquidTemplateManager.Validate(viewModel.Markdown, out var errors)) - { - var fieldName = context.PartFieldDefinition.DisplayName(); - updater.ModelState.AddModelError(Prefix, nameof(viewModel.Markdown), S["{0} field doesn't contain a valid Liquid expression. Details: {1}", fieldName, string.Join(" ", errors)]); - } - else - { - field.Markdown = viewModel.Markdown; - } + var fieldName = context.PartFieldDefinition.DisplayName(); + updater.ModelState.AddModelError(Prefix, nameof(viewModel.Markdown), S["{0} field doesn't contain a valid Liquid expression. Details: {1}", fieldName, string.Join(" ", errors)]); + } + else + { + field.Markdown = viewModel.Markdown; } return Edit(field, context); diff --git a/src/OrchardCore.Modules/OrchardCore.Markdown/Settings/MarkdownBodyPartSettingsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Markdown/Settings/MarkdownBodyPartSettingsDisplayDriver.cs index c1e80881c81..f5dcf7d88f2 100644 --- a/src/OrchardCore.Modules/OrchardCore.Markdown/Settings/MarkdownBodyPartSettingsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Markdown/Settings/MarkdownBodyPartSettingsDisplayDriver.cs @@ -26,12 +26,11 @@ public override async Task UpdateAsync(ContentTypePartDefinition var model = new MarkdownBodyPartSettingsViewModel(); var settings = new MarkdownBodyPartSettings(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) - { - settings.SanitizeHtml = model.SanitizeHtml; + await context.Updater.TryUpdateModelAsync(model, Prefix); - context.Builder.WithSettings(settings); - } + settings.SanitizeHtml = model.SanitizeHtml; + + context.Builder.WithSettings(settings); return Edit(contentTypePartDefinition, context.Updater); } diff --git a/src/OrchardCore.Modules/OrchardCore.Markdown/Settings/MarkdownFieldSettingsDriver.cs b/src/OrchardCore.Modules/OrchardCore.Markdown/Settings/MarkdownFieldSettingsDriver.cs index 5deba7bb77c..473d4bde420 100644 --- a/src/OrchardCore.Modules/OrchardCore.Markdown/Settings/MarkdownFieldSettingsDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Markdown/Settings/MarkdownFieldSettingsDriver.cs @@ -26,13 +26,12 @@ public override async Task UpdateAsync(ContentPartFieldDefinitio var model = new MarkdownFieldSettingsViewModel(); var settings = new MarkdownFieldSettings(); - if (await context.Updater.TryUpdateModelAsync(model, Prefix)) - { - settings.SanitizeHtml = model.SanitizeHtml; - settings.Hint = model.Hint; + await context.Updater.TryUpdateModelAsync(model, Prefix); + + settings.SanitizeHtml = model.SanitizeHtml; + settings.Hint = model.Hint; - context.Builder.WithSettings(settings); - } + context.Builder.WithSettings(settings); return Edit(partFieldDefinition); } diff --git a/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/.vscode/launch.json b/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/.vscode/launch.json new file mode 100644 index 00000000000..e558178e456 --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + "version": "0.2.0", + "configurations": [ + { + //"preLaunchTask": "dev", + "name": "chrome", + "type": "chrome", + "request": "launch", + "url": "http://localhost:5173", + "enableContentValidation": false, + "webRoot": "${workspaceFolder}/src", + "sourceMaps": true, + "resolveSourceMapLocations": [ + "${workspaceFolder}/src/**", + "!**/node_modules/**" + ], + "pathMapping": { "url": "/src/", "path": "${webRoot}/" } + } + ] +} diff --git a/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/.vscode/tasks.json b/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/.vscode/tasks.json new file mode 100644 index 00000000000..cfdaf26f2c3 --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/.vscode/tasks.json @@ -0,0 +1,35 @@ +{ + "version": "2.0.0", + "linux": { + "command": "sh", + "args": [ + "-c" + ] + }, + "osx": { + "command": "sh", + "args": [ + "-c" + ] + }, + "windows": { + "options": { + "shell": { + "executable": "cmd.exe", + "args": [ + "/C" + ] + } + } + }, + "tasks": [ + { + "label": "dev", + "type": "shell", + "command": "npx", + "args": [ + "vite" + ] + } + ] +} diff --git a/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/assets/index.css b/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/assets/index.css new file mode 100644 index 00000000000..5c8099463b5 --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/assets/index.css @@ -0,0 +1,7523 @@ +/** +* General Uppy styles that apply to everything inside the .uppy-Root container +*/ +.uppy-Root { + position: relative; + box-sizing: border-box; + color: #333; + font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Segoe UI Symbol", "Segoe UI Emoji", "Apple Color Emoji", Roboto, Helvetica, Arial, sans-serif; + line-height: 1; + text-align: left; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +[dir=rtl] .uppy-Root, +.uppy-Root[dir=rtl] { + text-align: right; +} + +.uppy-Root *, +.uppy-Root *::before, +.uppy-Root *::after { + box-sizing: inherit; +} + +.uppy-Root [hidden] { + display: none; +} + +.uppy-u-reset { + all: initial; + box-sizing: border-box; + -webkit-appearance: none; + appearance: none; + font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Segoe UI Symbol", "Segoe UI Emoji", "Apple Color Emoji", Roboto, Helvetica, Arial, sans-serif; + line-height: 1; +} + +[dir=rtl] .uppy-u-reset { + text-align: right; +} + +.uppy-c-textInput { + font-family: inherit; + font-size: 14px; + line-height: 1.5; + padding: 6px 8px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; +} +.uppy-size--md .uppy-c-textInput { + padding: 8px 10px; +} +.uppy-c-textInput:focus { + border-color: rgba(18, 105, 207, 0.6); + outline: none; + box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.15); +} +[data-uppy-theme=dark] .uppy-c-textInput { + color: #eaeaea; + background-color: #333; + border-color: #333; +} +[data-uppy-theme=dark] .uppy-c-textInput:focus { + border-color: #525252; + box-shadow: none; +} + +.uppy-c-icon { + display: inline-block; + max-width: 100%; + max-height: 100%; + overflow: hidden; + fill: currentColor; +} + +.uppy-c-btn { + display: inline-flex; + justify-content: center; + align-items: center; + font-weight: 500; + font-size: inherit; + font-family: inherit; + color: inherit; + line-height: 1; + white-space: nowrap; + text-align: center; + transition-duration: 0.3s; + transition-property: background-color, color; + -webkit-user-select: none; + user-select: none; +} +[dir=rtl] .uppy-c-btn { + text-align: center; +} + +.uppy-c-btn:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.uppy-c-btn::-moz-focus-inner { + border: 0; +} + +.uppy-c-btn-primary { + padding: 10px 18px; + color: #fff; + font-size: 14px; + background-color: #1269cf; + border-radius: 4px; +} +.uppy-c-btn-primary:hover { + background-color: #0e51a0; +} +.uppy-c-btn-primary:focus { + outline: none; + box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.4); +} +.uppy-size--md .uppy-c-btn-primary { + padding: 13px 22px; +} +[data-uppy-theme=dark] .uppy-c-btn-primary { + color: #eaeaea; +} +[data-uppy-theme=dark] .uppy-c-btn-primary:focus { + outline: none; +} +[data-uppy-theme=dark] .uppy-c-btn-primary::-moz-focus-inner { + border: 0; +} +[data-uppy-theme=dark] .uppy-c-btn-primary:focus { + box-shadow: 0 0 0 2px rgba(170, 225, 255, 0.85); +} + +.uppy-c-btn-link { + padding: 10px 15px; + color: #525252; + font-size: 14px; + line-height: 1; + background-color: transparent; + border-radius: 4px; +} +.uppy-c-btn-link:hover { + color: #333; +} +.uppy-c-btn-link:focus { + outline: none; + box-shadow: 0 0 0 3px rgba(18, 105, 207, 0.25); +} +.uppy-size--md .uppy-c-btn-link { + padding: 13px 18px; +} +[data-uppy-theme=dark] .uppy-c-btn-link { + color: #eaeaea; +} +[data-uppy-theme=dark] .uppy-c-btn-link:focus { + outline: none; +} +[data-uppy-theme=dark] .uppy-c-btn-link::-moz-focus-inner { + border: 0; +} +[data-uppy-theme=dark] .uppy-c-btn-link:focus { + box-shadow: 0 0 0 2px rgba(170, 225, 255, 0.85); +} +[data-uppy-theme=dark] .uppy-c-btn-link:hover { + color: #939393; +}.uppy-is-drag-over::after { + position: fixed; + top: 7px; + right: 7px; + bottom: 7px; + left: 7px; + z-index: 10000; + background-color: rgba(234, 234, 234, 0.5); + border: 5px dashed #bbb; + content: ""; +}:root, +[data-bs-theme=light] { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-primary-text-emphasis: #052c65; + --bs-secondary-text-emphasis: #2b2f32; + --bs-success-text-emphasis: #0a3622; + --bs-info-text-emphasis: #055160; + --bs-warning-text-emphasis: #664d03; + --bs-danger-text-emphasis: #58151c; + --bs-light-text-emphasis: #495057; + --bs-dark-text-emphasis: #495057; + --bs-primary-bg-subtle: #cfe2ff; + --bs-secondary-bg-subtle: #e2e3e5; + --bs-success-bg-subtle: #d1e7dd; + --bs-info-bg-subtle: #cff4fc; + --bs-warning-bg-subtle: #fff3cd; + --bs-danger-bg-subtle: #f8d7da; + --bs-light-bg-subtle: #fcfcfd; + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: #9ec5fe; + --bs-secondary-border-subtle: #c4c8cb; + --bs-success-border-subtle: #a3cfbb; + --bs-info-border-subtle: #9eeaf9; + --bs-warning-border-subtle: #ffe69c; + --bs-danger-border-subtle: #f1aeb5; + --bs-light-border-subtle: #e9ecef; + --bs-dark-border-subtle: #adb5bd; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(33, 37, 41, 0.75); + --bs-secondary-color-rgb: 33, 37, 41; + --bs-secondary-bg: #e9ecef; + --bs-secondary-bg-rgb: 233, 236, 239; + --bs-tertiary-color: rgba(33, 37, 41, 0.5); + --bs-tertiary-color-rgb: 33, 37, 41; + --bs-tertiary-bg: #f8f9fa; + --bs-tertiary-bg-rgb: 248, 249, 250; + --bs-heading-color: inherit; + --bs-link-color: #0d6efd; + --bs-link-color-rgb: 13, 110, 253; + --bs-link-decoration: underline; + --bs-link-hover-color: #0a58ca; + --bs-link-hover-color-rgb: 10, 88, 202; + --bs-code-color: #d63384; + --bs-highlight-color: #212529; + --bs-highlight-bg: #fff3cd; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); + --bs-border-radius-pill: 50rem; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(13, 110, 253, 0.25); + --bs-form-valid-color: #198754; + --bs-form-valid-border-color: #198754; + --bs-form-invalid-color: #dc3545; + --bs-form-invalid-border-color: #dc3545; +} +[data-bs-theme=dark] { + color-scheme: dark; + --bs-body-color: #dee2e6; + --bs-body-color-rgb: 222, 226, 230; + --bs-body-bg: #212529; + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(222, 226, 230, 0.75); + --bs-secondary-color-rgb: 222, 226, 230; + --bs-secondary-bg: #343a40; + --bs-secondary-bg-rgb: 52, 58, 64; + --bs-tertiary-color: rgba(222, 226, 230, 0.5); + --bs-tertiary-color-rgb: 222, 226, 230; + --bs-tertiary-bg: #2b3035; + --bs-tertiary-bg-rgb: 43, 48, 53; + --bs-primary-text-emphasis: #6ea8fe; + --bs-secondary-text-emphasis: #a7acb1; + --bs-success-text-emphasis: #75b798; + --bs-info-text-emphasis: #6edff6; + --bs-warning-text-emphasis: #ffda6a; + --bs-danger-text-emphasis: #ea868f; + --bs-light-text-emphasis: #f8f9fa; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: #031633; + --bs-secondary-bg-subtle: #161719; + --bs-success-bg-subtle: #051b11; + --bs-info-bg-subtle: #032830; + --bs-warning-bg-subtle: #332701; + --bs-danger-bg-subtle: #2c0b0e; + --bs-light-bg-subtle: #343a40; + --bs-dark-bg-subtle: #1a1d20; + --bs-primary-border-subtle: #084298; + --bs-secondary-border-subtle: #41464b; + --bs-success-border-subtle: #0f5132; + --bs-info-border-subtle: #087990; + --bs-warning-border-subtle: #997404; + --bs-danger-border-subtle: #842029; + --bs-light-border-subtle: #495057; + --bs-dark-border-subtle: #343a40; + --bs-heading-color: inherit; + --bs-link-color: #6ea8fe; + --bs-link-hover-color: #8bb9fe; + --bs-link-color-rgb: 110, 168, 254; + --bs-link-hover-color-rgb: 139, 185, 254; + --bs-code-color: #e685b5; + --bs-highlight-color: #dee2e6; + --bs-highlight-bg: #664d03; + --bs-border-color: #495057; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: #75b798; + --bs-form-valid-border-color: #75b798; + --bs-form-invalid-color: #ea868f; + --bs-form-invalid-border-color: #ea868f; +} +*, +*::before, +*::after { + box-sizing: border-box; +} +@media (prefers-reduced-motion: no-preference) { +:root { + scroll-behavior: smooth; +} +} +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +hr { + margin: 1rem 0; + color: inherit; + border: 0; + border-top: var(--bs-border-width) solid; + opacity: 0.25; +} +h6, h5, h4, h3, h2, h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; + color: var(--bs-heading-color); +} +h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { +h1 { + font-size: 2.5rem; +} +} +h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { +h2 { + font-size: 2rem; +} +} +h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { +h3 { + font-size: 1.75rem; +} +} +h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { +h4 { + font-size: 1.5rem; +} +} +h5 { + font-size: 1.25rem; +} +h6 { + font-size: 1rem; +} +p { + margin-top: 0; + margin-bottom: 1rem; +} +abbr[title] { + text-decoration: underline dotted; + cursor: help; + text-decoration-skip-ink: none; +} +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} +ol, +ul { + padding-left: 2rem; +} +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} +dt { + font-weight: 700; +} +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} +blockquote { + margin: 0 0 1rem; +} +b, +strong { + font-weight: bolder; +} +small { + font-size: 0.875em; +} +mark { + padding: 0.1875em; + color: var(--bs-highlight-color); + background-color: var(--bs-highlight-bg); +} +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +a { + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); + text-decoration: underline; +} +a:hover { + --bs-link-color-rgb: var(--bs-link-hover-color-rgb); +} +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; +} +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} +code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; +} +a > code { + color: inherit; +} +kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; +} +kbd kbd { + padding: 0; + font-size: 1em; +} +figure { + margin: 0 0 1rem; +} +img, +svg { + vertical-align: middle; +} +table { + caption-side: bottom; + border-collapse: collapse; +} +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-secondary-color); + text-align: left; +} +th { + text-align: inherit; + text-align: -webkit-match-parent; +} +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} +label { + display: inline-block; +} +button { + border-radius: 0; +} +button:focus:not(:focus-visible) { + outline: 0; +} +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +button, +select { + text-transform: none; +} +[role=button] { + cursor: pointer; +} +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} +[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { + display: none !important; +} +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} +button:not(:disabled), +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled) { + cursor: pointer; +} +::-moz-focus-inner { + padding: 0; + border-style: none; +} +textarea { + resize: vertical; +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { +legend { + font-size: 1.5rem; +} +} +legend + * { + clear: left; +} +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} +::-webkit-inner-spin-button { + height: auto; +} +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-color-swatch-wrapper { + padding: 0; +} +::file-selector-button { + font: inherit; + -webkit-appearance: button; +} +output { + display: inline-block; +} +iframe { + border: 0; +} +summary { + display: list-item; + cursor: pointer; +} +progress { + vertical-align: baseline; +} +[hidden] { + display: none !important; +} +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: var(--bs-body-color); + --bs-btn-bg: transparent; + --bs-btn-border-width: var(--bs-border-width); + --bs-btn-border-color: transparent; + --bs-btn-border-radius: var(--bs-border-radius); + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.btn { + transition: none; +} +} +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); +} +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn:disabled, .btn.disabled, fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); +} +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0b5ed7; + --bs-btn-hover-border-color: #0a58ca; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0a58ca; + --bs-btn-active-border-color: #0a53be; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #0d6efd; + --bs-btn-disabled-border-color: #0d6efd; +} +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #5c636a; + --bs-btn-hover-border-color: #565e64; + --bs-btn-focus-shadow-rgb: 130, 138, 145; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #565e64; + --bs-btn-active-border-color: #51585e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #6c757d; + --bs-btn-disabled-border-color: #6c757d; +} +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #157347; + --bs-btn-hover-border-color: #146c43; + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #146c43; + --bs-btn-active-border-color: #13653f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754; +} +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #31d2f2; + --bs-btn-hover-border-color: #25cff2; + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #3dd5f3; + --bs-btn-active-border-color: #25cff2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0; +} +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffca2c; + --bs-btn-hover-border-color: #ffc720; + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffcd39; + --bs-btn-active-border-color: #ffc720; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107; +} +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #bb2d3b; + --bs-btn-hover-border-color: #b02a37; + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #b02a37; + --bs-btn-active-border-color: #a52834; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545; +} +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d3d4d5; + --bs-btn-hover-border-color: #c6c7c8; + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c6c7c8; + --bs-btn-active-border-color: #babbbc; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; +} +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #424649; + --bs-btn-hover-border-color: #373b3e; + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #4d5154; + --bs-btn-active-border-color: #373b3e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529; +} +.btn-outline-primary { + --bs-btn-color: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0d6efd; + --bs-btn-hover-border-color: #0d6efd; + --bs-btn-focus-shadow-rgb: 13, 110, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0d6efd; + --bs-btn-active-border-color: #0d6efd; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0d6efd; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0d6efd; + --bs-gradient: none; +} +.btn-outline-secondary { + --bs-btn-color: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6c757d; + --bs-btn-hover-border-color: #6c757d; + --bs-btn-focus-shadow-rgb: 108, 117, 125; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #6c757d; + --bs-btn-active-border-color: #6c757d; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #6c757d; + --bs-gradient: none; +} +.btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none; +} +.btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none; +} +.btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none; +} +.btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none; +} +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; +} +.btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none; +} +.btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: 0 0 0 #000; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + text-decoration: underline; +} +.btn-link:focus-visible { + color: var(--bs-btn-color); +} +.btn-link:hover { + color: var(--bs-btn-hover-color); +} +.btn-lg, .btn-group-lg > .btn { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: var(--bs-border-radius-lg); +} +.btn-sm, .btn-group-sm > .btn { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: var(--bs-border-radius-sm); +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} +.btn-group { + border-radius: var(--bs-border-radius); +} +.btn-group > :not(.btn-check:first-child) + .btn, +.btn-group > .btn-group:not(:first-child) { + margin-left: calc(var(--bs-border-width) * -1); +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn.dropdown-toggle-split:first-child, +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:nth-child(n+3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: calc(var(--bs-border-width) * -1); +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn ~ .btn, +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + background: none; + border: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.nav-link { + transition: none; +} +} +.nav-link:hover, .nav-link:focus { + color: var(--bs-nav-link-hover-color); +} +.nav-link:focus-visible { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.nav-link.disabled, .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; +} +.nav-tabs { + --bs-nav-tabs-border-width: var(--bs-border-width); + --bs-nav-tabs-border-color: var(--bs-border-color); + --bs-nav-tabs-border-radius: var(--bs-border-radius); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color); + --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); + --bs-nav-tabs-link-active-bg: var(--bs-body-bg); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); +} +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); +} +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.nav-pills { + --bs-nav-pills-border-radius: var(--bs-border-radius); + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #0d6efd; +} +.nav-pills .nav-link { + border-radius: var(--bs-nav-pills-border-radius); +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} +.nav-underline { + --bs-nav-underline-gap: 1rem; + --bs-nav-underline-border-width: 0.125rem; + --bs-nav-underline-link-active-color: var(--bs-emphasis-color); + gap: var(--bs-nav-underline-gap); +} +.nav-underline .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--bs-nav-underline-border-width) solid transparent; +} +.nav-underline .nav-link:hover, .nav-underline .nav-link:focus { + border-bottom-color: currentcolor; +} +.nav-underline .nav-link.active, +.nav-underline .show > .nav-link { + font-weight: 700; + color: var(--bs-nav-underline-link-active-color); + border-bottom-color: currentcolor; +} +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: var(--bs-body-bg); + --bs-pagination-border-width: var(--bs-border-width); + --bs-pagination-border-color: var(--bs-border-color); + --bs-pagination-border-radius: var(--bs-border-radius); + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: var(--bs-tertiary-bg); + --bs-pagination-hover-border-color: var(--bs-border-color); + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: var(--bs-secondary-bg); + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #0d6efd; + --bs-pagination-active-border-color: #0d6efd; + --bs-pagination-disabled-color: var(--bs-secondary-color); + --bs-pagination-disabled-bg: var(--bs-secondary-bg); + --bs-pagination-disabled-border-color: var(--bs-border-color); + display: flex; + padding-left: 0; + list-style: none; +} +.page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.page-link { + transition: none; +} +} +.page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); +} +.page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.page-link.active, .active > .page-link { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.page-link.disabled, .disabled > .page-link { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); +} +.page-item:not(:first-child) .page-link { + margin-left: calc(var(--bs-border-width) * -1); +} +.page-item:first-child .page-link { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); +} +.page-item:last-child .page-link { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); +} +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: var(--bs-border-radius-lg); +} +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: var(--bs-border-radius-sm); +} +.table { + --bs-table-color-type: initial; + --bs-table-bg-type: initial; + --bs-table-color-state: initial; + --bs-table-bg-state: initial; + --bs-table-color: var(--bs-emphasis-color); + --bs-table-bg: var(--bs-body-bg); + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-emphasis-color); + --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05); + --bs-table-active-color: var(--bs-emphasis-color); + --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1); + --bs-table-hover-color: var(--bs-emphasis-color); + --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075); + width: 100%; + margin-bottom: 1rem; + vertical-align: top; + border-color: var(--bs-table-border-color); +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color))); + background-color: var(--bs-table-bg); + border-bottom-width: var(--bs-border-width); + box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} +.table-group-divider { + border-top: calc(var(--bs-border-width) * 2) solid currentcolor; +} +.caption-top { + caption-side: top; +} +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} +.table-bordered > :not(caption) > * { + border-width: var(--bs-border-width) 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 var(--bs-border-width); +} +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} +.table-striped-columns > :not(caption) > tr > :nth-child(even) { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} +.table-active { + --bs-table-color-state: var(--bs-table-active-color); + --bs-table-bg-state: var(--bs-table-active-bg); +} +.table-hover > tbody > tr:hover > * { + --bs-table-color-state: var(--bs-table-hover-color); + --bs-table-bg-state: var(--bs-table-hover-bg); +} +.table-primary { + --bs-table-color: #000; + --bs-table-bg: #cfe2ff; + --bs-table-border-color: #a6b5cc; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: #e2e3e5; + --bs-table-border-color: #b5b6b7; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-success { + --bs-table-color: #000; + --bs-table-bg: #d1e7dd; + --bs-table-border-color: #a7b9b1; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-info { + --bs-table-color: #000; + --bs-table-bg: #cff4fc; + --bs-table-border-color: #a6c3ca; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-warning { + --bs-table-color: #000; + --bs-table-bg: #fff3cd; + --bs-table-border-color: #ccc2a4; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-danger { + --bs-table-color: #000; + --bs-table-bg: #f8d7da; + --bs-table-border-color: #c6acae; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: #c6c7c8; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: #4d5154; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +@media (max-width: 575.98px) { +.table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +} +@media (max-width: 767.98px) { +.table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +} +@media (max-width: 991.98px) { +.table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +} +@media (max-width: 1199.98px) { +.table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +} +@media (max-width: 1399.98px) { +.table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +} +.form-label { + margin-bottom: 0.5rem; +} +.col-form-label { + padding-top: calc(0.375rem + var(--bs-border-width)); + padding-bottom: calc(0.375rem + var(--bs-border-width)); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} +.col-form-label-lg { + padding-top: calc(0.5rem + var(--bs-border-width)); + padding-bottom: calc(0.5rem + var(--bs-border-width)); + font-size: 1.25rem; +} +.col-form-label-sm { + padding-top: calc(0.25rem + var(--bs-border-width)); + padding-bottom: calc(0.25rem + var(--bs-border-width)); + font-size: 0.875rem; +} +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-secondary-color); +} +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + appearance: none; + background-color: var(--bs-body-bg); + background-clip: padding-box; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.form-control { + transition: none; +} +} +.form-control[type=file] { + overflow: hidden; +} +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value { + min-width: 85px; + height: 1.5em; + margin: 0; +} +.form-control::-webkit-datetime-edit { + display: block; + padding: 0; +} +.form-control::placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control:disabled { + background-color: var(--bs-secondary-bg); + opacity: 1; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.form-control::file-selector-button { + transition: none; +} +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: var(--bs-secondary-bg); +} +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: var(--bs-body-color); + background-color: transparent; + border: solid transparent; + border-width: var(--bs-border-width) 0; +} +.form-control-plaintext:focus { + outline: 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} +.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + margin-inline-end: 1rem; +} +textarea.form-control { + min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color::-webkit-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} +.form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + appearance: none; + background-color: var(--bs-body-bg); + background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.form-select { + transition: none; +} +} +.form-select:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], .form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: var(--bs-secondary-bg); +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 var(--bs-body-color); +} +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +[data-bs-theme=dark] .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); +} +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} +.form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + flex-shrink: 0; + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + appearance: none; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); + print-color-adjust: exact; +} +.form-check-input[type=checkbox] { + border-radius: 0.25em; +} +.form-check-input[type=radio] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type=checkbox] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type=radio] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type=checkbox]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + cursor: default; + opacity: 0.5; +} +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + width: 2em; + margin-left: -2.5em; + background-image: var(--bs-form-switch-bg); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.form-switch .form-check-input { + transition: none; +} +} +.form-switch .form-check-input:focus { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; +} +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} +[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); +} +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + appearance: none; + background-color: transparent; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.form-range::-webkit-slider-thumb { + transition: none; +} +} +.form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.form-range::-moz-range-thumb { + transition: none; +} +} +.form-range::-moz-range-thumb:active { + background-color: #b6d4fe; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: var(--bs-secondary-color); +} +.form-range:disabled::-moz-range-thumb { + background-color: var(--bs-secondary-color); +} +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext, +.form-floating > .form-select { + height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + z-index: 2; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: var(--bs-border-width) solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { +.form-floating > label { + transition: none; +} +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::placeholder, +.form-floating > .form-control-plaintext::placeholder { + color: transparent; +} +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill, +.form-floating > .form-control-plaintext:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-control-plaintext ~ label, +.form-floating > .form-select ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label::after, +.form-floating > .form-control:not(:placeholder-shown) ~ label::after, +.form-floating > .form-control-plaintext ~ label::after, +.form-floating > .form-select ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > .form-control:-webkit-autofill ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label { + border-width: var(--bs-border-width) 0; +} +.form-floating > :disabled ~ label, +.form-floating > .form-control:disabled ~ label { + color: #6c757d; +} +.form-floating > :disabled ~ label::after, +.form-floating > .form-control:disabled ~ label::after { + background-color: var(--bs-secondary-bg); +} +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select, +.input-group > .form-floating { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus, +.input-group > .form-floating:focus-within { + z-index: 5; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 5; +} +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-tertiary-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); +} +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} +.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: calc(var(--bs-border-width) * -1); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .form-floating:not(:first-child) > .form-control, +.input-group > .form-floating:not(:first-child) > .form-select { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-valid-color); +} +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-success); + border-radius: var(--bs-border-radius); +} +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .form-control:valid, .form-control.is-valid { + border-color: var(--bs-form-valid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} +.was-validated .form-select:valid, .form-select.is-valid { + border-color: var(--bs-form-valid-border-color); +} +.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, .form-select.is-valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.was-validated .form-control-color:valid, .form-control-color.is-valid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} +.was-validated .form-check-input:valid, .form-check-input.is-valid { + border-color: var(--bs-form-valid-border-color); +} +.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { + background-color: var(--bs-form-valid-color); +} +.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: var(--bs-form-valid-color); +} +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} +.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, +.was-validated .input-group > .form-select:not(:focus):valid, +.input-group > .form-select:not(:focus).is-valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.input-group > .form-floating:not(:focus-within).is-valid { + z-index: 3; +} +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-invalid-color); +} +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-danger); + border-radius: var(--bs-border-radius); +} +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: var(--bs-form-invalid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} +.was-validated .form-select:invalid, .form-select.is-invalid { + border-color: var(--bs-form-invalid-border-color); +} +.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.was-validated .form-control-color:invalid, .form-control-color.is-invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} +.was-validated .form-check-input:invalid, .form-check-input.is-invalid { + border-color: var(--bs-form-invalid-border-color); +} +.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { + background-color: var(--bs-form-invalid-color); +} +.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: var(--bs-form-invalid-color); +} +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} +.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, +.was-validated .input-group > .form-select:not(:focus):invalid, +.input-group > .form-select:not(:focus).is-invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.input-group > .form-floating:not(:focus-within).is-invalid { + z-index: 4; +} +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: var(--bs-secondary-color); + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); +} +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; +} +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); +} +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); + --bs-alert-border-radius: var(--bs-border-radius); + --bs-alert-link-color: inherit; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); +} +.alert-heading { + color: inherit; +} +.alert-link { + font-weight: 700; + color: var(--bs-alert-link-color); +} +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} +.alert-primary { + --bs-alert-color: var(--bs-primary-text-emphasis); + --bs-alert-bg: var(--bs-primary-bg-subtle); + --bs-alert-border-color: var(--bs-primary-border-subtle); + --bs-alert-link-color: var(--bs-primary-text-emphasis); +} +.alert-secondary { + --bs-alert-color: var(--bs-secondary-text-emphasis); + --bs-alert-bg: var(--bs-secondary-bg-subtle); + --bs-alert-border-color: var(--bs-secondary-border-subtle); + --bs-alert-link-color: var(--bs-secondary-text-emphasis); +} +.alert-success { + --bs-alert-color: var(--bs-success-text-emphasis); + --bs-alert-bg: var(--bs-success-bg-subtle); + --bs-alert-border-color: var(--bs-success-border-subtle); + --bs-alert-link-color: var(--bs-success-text-emphasis); +} +.alert-info { + --bs-alert-color: var(--bs-info-text-emphasis); + --bs-alert-bg: var(--bs-info-bg-subtle); + --bs-alert-border-color: var(--bs-info-border-subtle); + --bs-alert-link-color: var(--bs-info-text-emphasis); +} +.alert-warning { + --bs-alert-color: var(--bs-warning-text-emphasis); + --bs-alert-bg: var(--bs-warning-bg-subtle); + --bs-alert-border-color: var(--bs-warning-border-subtle); + --bs-alert-link-color: var(--bs-warning-text-emphasis); +} +.alert-danger { + --bs-alert-color: var(--bs-danger-text-emphasis); + --bs-alert-bg: var(--bs-danger-bg-subtle); + --bs-alert-border-color: var(--bs-danger-border-subtle); + --bs-alert-link-color: var(--bs-danger-text-emphasis); +} +.alert-light { + --bs-alert-color: var(--bs-light-text-emphasis); + --bs-alert-bg: var(--bs-light-bg-subtle); + --bs-alert-border-color: var(--bs-light-border-subtle); + --bs-alert-link-color: var(--bs-light-text-emphasis); +} +.alert-dark { + --bs-alert-color: var(--bs-dark-text-emphasis); + --bs-alert-bg: var(--bs-dark-bg-subtle); + --bs-alert-border-color: var(--bs-dark-border-subtle); + --bs-alert-link-color: var(--bs-dark-text-emphasis); +} +.align-baseline { + vertical-align: baseline !important; +} +.align-top { + vertical-align: top !important; +} +.align-middle { + vertical-align: middle !important; +} +.align-bottom { + vertical-align: bottom !important; +} +.align-text-bottom { + vertical-align: text-bottom !important; +} +.align-text-top { + vertical-align: text-top !important; +} +.float-start { + float: left !important; +} +.float-end { + float: right !important; +} +.float-none { + float: none !important; +} +.object-fit-contain { + object-fit: contain !important; +} +.object-fit-cover { + object-fit: cover !important; +} +.object-fit-fill { + object-fit: fill !important; +} +.object-fit-scale { + object-fit: scale-down !important; +} +.object-fit-none { + object-fit: none !important; +} +.opacity-0 { + opacity: 0 !important; +} +.opacity-25 { + opacity: 0.25 !important; +} +.opacity-50 { + opacity: 0.5 !important; +} +.opacity-75 { + opacity: 0.75 !important; +} +.opacity-100 { + opacity: 1 !important; +} +.overflow-auto { + overflow: auto !important; +} +.overflow-hidden { + overflow: hidden !important; +} +.overflow-visible { + overflow: visible !important; +} +.overflow-scroll { + overflow: scroll !important; +} +.overflow-x-auto { + overflow-x: auto !important; +} +.overflow-x-hidden { + overflow-x: hidden !important; +} +.overflow-x-visible { + overflow-x: visible !important; +} +.overflow-x-scroll { + overflow-x: scroll !important; +} +.overflow-y-auto { + overflow-y: auto !important; +} +.overflow-y-hidden { + overflow-y: hidden !important; +} +.overflow-y-visible { + overflow-y: visible !important; +} +.overflow-y-scroll { + overflow-y: scroll !important; +} +.d-inline { + display: inline !important; +} +.d-inline-block { + display: inline-block !important; +} +.d-block { + display: block !important; +} +.d-grid { + display: grid !important; +} +.d-inline-grid { + display: inline-grid !important; +} +.d-table { + display: table !important; +} +.d-table-row { + display: table-row !important; +} +.d-table-cell { + display: table-cell !important; +} +.d-flex { + display: flex !important; +} +.d-inline-flex { + display: inline-flex !important; +} +.d-none { + display: none !important; +} +.shadow { + box-shadow: var(--bs-box-shadow) !important; +} +.shadow-sm { + box-shadow: var(--bs-box-shadow-sm) !important; +} +.shadow-lg { + box-shadow: var(--bs-box-shadow-lg) !important; +} +.shadow-none { + box-shadow: none !important; +} +.focus-ring-primary { + --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)); +} +.focus-ring-secondary { + --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)); +} +.focus-ring-success { + --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)); +} +.focus-ring-info { + --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)); +} +.focus-ring-warning { + --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)); +} +.focus-ring-danger { + --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)); +} +.focus-ring-light { + --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)); +} +.focus-ring-dark { + --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)); +} +.position-static { + position: static !important; +} +.position-relative { + position: relative !important; +} +.position-absolute { + position: absolute !important; +} +.position-fixed { + position: fixed !important; +} +.position-sticky { + position: sticky !important; +} +.top-0 { + top: 0 !important; +} +.top-50 { + top: 50% !important; +} +.top-100 { + top: 100% !important; +} +.bottom-0 { + bottom: 0 !important; +} +.bottom-50 { + bottom: 50% !important; +} +.bottom-100 { + bottom: 100% !important; +} +.start-0 { + left: 0 !important; +} +.start-50 { + left: 50% !important; +} +.start-100 { + left: 100% !important; +} +.end-0 { + right: 0 !important; +} +.end-50 { + right: 50% !important; +} +.end-100 { + right: 100% !important; +} +.translate-middle { + transform: translate(-50%, -50%) !important; +} +.translate-middle-x { + transform: translateX(-50%) !important; +} +.translate-middle-y { + transform: translateY(-50%) !important; +} +.border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} +.border-0 { + border: 0 !important; +} +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} +.border-top-0 { + border-top: 0 !important; +} +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} +.border-end-0 { + border-right: 0 !important; +} +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} +.border-bottom-0 { + border-bottom: 0 !important; +} +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} +.border-start-0 { + border-left: 0 !important; +} +.border-primary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; +} +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; +} +.border-success { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; +} +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; +} +.border-warning { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; +} +.border-danger { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; +} +.border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; +} +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} +.border-black { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important; +} +.border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; +} +.border-primary-subtle { + border-color: var(--bs-primary-border-subtle) !important; +} +.border-secondary-subtle { + border-color: var(--bs-secondary-border-subtle) !important; +} +.border-success-subtle { + border-color: var(--bs-success-border-subtle) !important; +} +.border-info-subtle { + border-color: var(--bs-info-border-subtle) !important; +} +.border-warning-subtle { + border-color: var(--bs-warning-border-subtle) !important; +} +.border-danger-subtle { + border-color: var(--bs-danger-border-subtle) !important; +} +.border-light-subtle { + border-color: var(--bs-light-border-subtle) !important; +} +.border-dark-subtle { + border-color: var(--bs-dark-border-subtle) !important; +} +.border-1 { + border-width: 1px !important; +} +.border-2 { + border-width: 2px !important; +} +.border-3 { + border-width: 3px !important; +} +.border-4 { + border-width: 4px !important; +} +.border-5 { + border-width: 5px !important; +} +.border-opacity-10 { + --bs-border-opacity: 0.1; +} +.border-opacity-25 { + --bs-border-opacity: 0.25; +} +.border-opacity-50 { + --bs-border-opacity: 0.5; +} +.border-opacity-75 { + --bs-border-opacity: 0.75; +} +.border-opacity-100 { + --bs-border-opacity: 1; +} +.w-25 { + width: 25% !important; +} +.w-50 { + width: 50% !important; +} +.w-75 { + width: 75% !important; +} +.w-100 { + width: 100% !important; +} +.w-auto { + width: auto !important; +} +.mw-100 { + max-width: 100% !important; +} +.vw-100 { + width: 100vw !important; +} +.min-vw-100 { + min-width: 100vw !important; +} +.h-25 { + height: 25% !important; +} +.h-50 { + height: 50% !important; +} +.h-75 { + height: 75% !important; +} +.h-100 { + height: 100% !important; +} +.h-auto { + height: auto !important; +} +.mh-100 { + max-height: 100% !important; +} +.vh-100 { + height: 100vh !important; +} +.min-vh-100 { + min-height: 100vh !important; +} +.flex-fill { + flex: 1 1 auto !important; +} +.flex-row { + flex-direction: row !important; +} +.flex-column { + flex-direction: column !important; +} +.flex-row-reverse { + flex-direction: row-reverse !important; +} +.flex-column-reverse { + flex-direction: column-reverse !important; +} +.flex-grow-0 { + flex-grow: 0 !important; +} +.flex-grow-1 { + flex-grow: 1 !important; +} +.flex-shrink-0 { + flex-shrink: 0 !important; +} +.flex-shrink-1 { + flex-shrink: 1 !important; +} +.flex-wrap { + flex-wrap: wrap !important; +} +.flex-nowrap { + flex-wrap: nowrap !important; +} +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} +.justify-content-start { + justify-content: flex-start !important; +} +.justify-content-end { + justify-content: flex-end !important; +} +.justify-content-center { + justify-content: center !important; +} +.justify-content-between { + justify-content: space-between !important; +} +.justify-content-around { + justify-content: space-around !important; +} +.justify-content-evenly { + justify-content: space-evenly !important; +} +.align-items-start { + align-items: flex-start !important; +} +.align-items-end { + align-items: flex-end !important; +} +.align-items-center { + align-items: center !important; +} +.align-items-baseline { + align-items: baseline !important; +} +.align-items-stretch { + align-items: stretch !important; +} +.align-content-start { + align-content: flex-start !important; +} +.align-content-end { + align-content: flex-end !important; +} +.align-content-center { + align-content: center !important; +} +.align-content-between { + align-content: space-between !important; +} +.align-content-around { + align-content: space-around !important; +} +.align-content-stretch { + align-content: stretch !important; +} +.align-self-auto { + align-self: auto !important; +} +.align-self-start { + align-self: flex-start !important; +} +.align-self-end { + align-self: flex-end !important; +} +.align-self-center { + align-self: center !important; +} +.align-self-baseline { + align-self: baseline !important; +} +.align-self-stretch { + align-self: stretch !important; +} +.order-first { + order: -1 !important; +} +.order-0 { + order: 0 !important; +} +.order-1 { + order: 1 !important; +} +.order-2 { + order: 2 !important; +} +.order-3 { + order: 3 !important; +} +.order-4 { + order: 4 !important; +} +.order-5 { + order: 5 !important; +} +.order-last { + order: 6 !important; +} +.m-0 { + margin: 0 !important; +} +.m-1 { + margin: 0.25rem !important; +} +.m-2 { + margin: 0.5rem !important; +} +.m-3 { + margin: 1rem !important; +} +.m-4 { + margin: 1.5rem !important; +} +.m-5 { + margin: 3rem !important; +} +.m-auto { + margin: auto !important; +} +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} +.mt-0 { + margin-top: 0 !important; +} +.mt-1 { + margin-top: 0.25rem !important; +} +.mt-2 { + margin-top: 0.5rem !important; +} +.mt-3 { + margin-top: 1rem !important; +} +.mt-4 { + margin-top: 1.5rem !important; +} +.mt-5 { + margin-top: 3rem !important; +} +.mt-auto { + margin-top: auto !important; +} +.me-0 { + margin-right: 0 !important; +} +.me-1 { + margin-right: 0.25rem !important; +} +.me-2 { + margin-right: 0.5rem !important; +} +.me-3 { + margin-right: 1rem !important; +} +.me-4 { + margin-right: 1.5rem !important; +} +.me-5 { + margin-right: 3rem !important; +} +.me-auto { + margin-right: auto !important; +} +.mb-0 { + margin-bottom: 0 !important; +} +.mb-1 { + margin-bottom: 0.25rem !important; +} +.mb-2 { + margin-bottom: 0.5rem !important; +} +.mb-3 { + margin-bottom: 1rem !important; +} +.mb-4 { + margin-bottom: 1.5rem !important; +} +.mb-5 { + margin-bottom: 3rem !important; +} +.mb-auto { + margin-bottom: auto !important; +} +.ms-0 { + margin-left: 0 !important; +} +.ms-1 { + margin-left: 0.25rem !important; +} +.ms-2 { + margin-left: 0.5rem !important; +} +.ms-3 { + margin-left: 1rem !important; +} +.ms-4 { + margin-left: 1.5rem !important; +} +.ms-5 { + margin-left: 3rem !important; +} +.ms-auto { + margin-left: auto !important; +} +.p-0 { + padding: 0 !important; +} +.p-1 { + padding: 0.25rem !important; +} +.p-2 { + padding: 0.5rem !important; +} +.p-3 { + padding: 1rem !important; +} +.p-4 { + padding: 1.5rem !important; +} +.p-5 { + padding: 3rem !important; +} +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} +.pt-0 { + padding-top: 0 !important; +} +.pt-1 { + padding-top: 0.25rem !important; +} +.pt-2 { + padding-top: 0.5rem !important; +} +.pt-3 { + padding-top: 1rem !important; +} +.pt-4 { + padding-top: 1.5rem !important; +} +.pt-5 { + padding-top: 3rem !important; +} +.pe-0 { + padding-right: 0 !important; +} +.pe-1 { + padding-right: 0.25rem !important; +} +.pe-2 { + padding-right: 0.5rem !important; +} +.pe-3 { + padding-right: 1rem !important; +} +.pe-4 { + padding-right: 1.5rem !important; +} +.pe-5 { + padding-right: 3rem !important; +} +.pb-0 { + padding-bottom: 0 !important; +} +.pb-1 { + padding-bottom: 0.25rem !important; +} +.pb-2 { + padding-bottom: 0.5rem !important; +} +.pb-3 { + padding-bottom: 1rem !important; +} +.pb-4 { + padding-bottom: 1.5rem !important; +} +.pb-5 { + padding-bottom: 3rem !important; +} +.ps-0 { + padding-left: 0 !important; +} +.ps-1 { + padding-left: 0.25rem !important; +} +.ps-2 { + padding-left: 0.5rem !important; +} +.ps-3 { + padding-left: 1rem !important; +} +.ps-4 { + padding-left: 1.5rem !important; +} +.ps-5 { + padding-left: 3rem !important; +} +.gap-0 { + gap: 0 !important; +} +.gap-1 { + gap: 0.25rem !important; +} +.gap-2 { + gap: 0.5rem !important; +} +.gap-3 { + gap: 1rem !important; +} +.gap-4 { + gap: 1.5rem !important; +} +.gap-5 { + gap: 3rem !important; +} +.row-gap-0 { + row-gap: 0 !important; +} +.row-gap-1 { + row-gap: 0.25rem !important; +} +.row-gap-2 { + row-gap: 0.5rem !important; +} +.row-gap-3 { + row-gap: 1rem !important; +} +.row-gap-4 { + row-gap: 1.5rem !important; +} +.row-gap-5 { + row-gap: 3rem !important; +} +.column-gap-0 { + column-gap: 0 !important; +} +.column-gap-1 { + column-gap: 0.25rem !important; +} +.column-gap-2 { + column-gap: 0.5rem !important; +} +.column-gap-3 { + column-gap: 1rem !important; +} +.column-gap-4 { + column-gap: 1.5rem !important; +} +.column-gap-5 { + column-gap: 3rem !important; +} +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} +.fs-5 { + font-size: 1.25rem !important; +} +.fs-6 { + font-size: 1rem !important; +} +.fst-italic { + font-style: italic !important; +} +.fst-normal { + font-style: normal !important; +} +.fw-lighter { + font-weight: lighter !important; +} +.fw-light { + font-weight: 300 !important; +} +.fw-normal { + font-weight: 400 !important; +} +.fw-medium { + font-weight: 500 !important; +} +.fw-semibold { + font-weight: 600 !important; +} +.fw-bold { + font-weight: 700 !important; +} +.fw-bolder { + font-weight: bolder !important; +} +.lh-1 { + line-height: 1 !important; +} +.lh-sm { + line-height: 1.25 !important; +} +.lh-base { + line-height: 1.5 !important; +} +.lh-lg { + line-height: 2 !important; +} +.text-start { + text-align: left !important; +} +.text-end { + text-align: right !important; +} +.text-center { + text-align: center !important; +} +.text-decoration-none { + text-decoration: none !important; +} +.text-decoration-underline { + text-decoration: underline !important; +} +.text-decoration-line-through { + text-decoration: line-through !important; +} +.text-lowercase { + text-transform: lowercase !important; +} +.text-uppercase { + text-transform: uppercase !important; +} +.text-capitalize { + text-transform: capitalize !important; +} +.text-wrap { + white-space: normal !important; +} +.text-nowrap { + white-space: nowrap !important; +} + +/* rtl:begin:remove */ +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +/* rtl:end:remove */ +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} +.text-muted { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} +.text-body-secondary { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} +.text-body-tertiary { + --bs-text-opacity: 1; + color: var(--bs-tertiary-color) !important; +} +.text-body-emphasis { + --bs-text-opacity: 1; + color: var(--bs-emphasis-color) !important; +} +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} +.text-opacity-25 { + --bs-text-opacity: 0.25; +} +.text-opacity-50 { + --bs-text-opacity: 0.5; +} +.text-opacity-75 { + --bs-text-opacity: 0.75; +} +.text-opacity-100 { + --bs-text-opacity: 1; +} +.text-primary-emphasis { + color: var(--bs-primary-text-emphasis) !important; +} +.text-secondary-emphasis { + color: var(--bs-secondary-text-emphasis) !important; +} +.text-success-emphasis { + color: var(--bs-success-text-emphasis) !important; +} +.text-info-emphasis { + color: var(--bs-info-text-emphasis) !important; +} +.text-warning-emphasis { + color: var(--bs-warning-text-emphasis) !important; +} +.text-danger-emphasis { + color: var(--bs-danger-text-emphasis) !important; +} +.text-light-emphasis { + color: var(--bs-light-text-emphasis) !important; +} +.text-dark-emphasis { + color: var(--bs-dark-text-emphasis) !important; +} +.link-opacity-10 { + --bs-link-opacity: 0.1; +} +.link-opacity-10-hover:hover { + --bs-link-opacity: 0.1; +} +.link-opacity-25 { + --bs-link-opacity: 0.25; +} +.link-opacity-25-hover:hover { + --bs-link-opacity: 0.25; +} +.link-opacity-50 { + --bs-link-opacity: 0.5; +} +.link-opacity-50-hover:hover { + --bs-link-opacity: 0.5; +} +.link-opacity-75 { + --bs-link-opacity: 0.75; +} +.link-opacity-75-hover:hover { + --bs-link-opacity: 0.75; +} +.link-opacity-100 { + --bs-link-opacity: 1; +} +.link-opacity-100-hover:hover { + --bs-link-opacity: 1; +} +.link-offset-1 { + text-underline-offset: 0.125em !important; +} +.link-offset-1-hover:hover { + text-underline-offset: 0.125em !important; +} +.link-offset-2 { + text-underline-offset: 0.25em !important; +} +.link-offset-2-hover:hover { + text-underline-offset: 0.25em !important; +} +.link-offset-3 { + text-underline-offset: 0.375em !important; +} +.link-offset-3-hover:hover { + text-underline-offset: 0.375em !important; +} +.link-underline-primary { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; +} +.link-underline-secondary { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; +} +.link-underline-success { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; +} +.link-underline-info { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; +} +.link-underline-warning { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; +} +.link-underline-danger { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; +} +.link-underline-light { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; +} +.link-underline-dark { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; +} +.link-underline { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-underline-opacity-0 { + --bs-link-underline-opacity: 0; +} +.link-underline-opacity-0-hover:hover { + --bs-link-underline-opacity: 0; +} +.link-underline-opacity-10 { + --bs-link-underline-opacity: 0.1; +} +.link-underline-opacity-10-hover:hover { + --bs-link-underline-opacity: 0.1; +} +.link-underline-opacity-25 { + --bs-link-underline-opacity: 0.25; +} +.link-underline-opacity-25-hover:hover { + --bs-link-underline-opacity: 0.25; +} +.link-underline-opacity-50 { + --bs-link-underline-opacity: 0.5; +} +.link-underline-opacity-50-hover:hover { + --bs-link-underline-opacity: 0.5; +} +.link-underline-opacity-75 { + --bs-link-underline-opacity: 0.75; +} +.link-underline-opacity-75-hover:hover { + --bs-link-underline-opacity: 0.75; +} +.link-underline-opacity-100 { + --bs-link-underline-opacity: 1; +} +.link-underline-opacity-100-hover:hover { + --bs-link-underline-opacity: 1; +} +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; +} +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; +} +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; +} +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; +} +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; +} +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; +} +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; +} +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; +} +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; +} +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} +.bg-body-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important; +} +.bg-body-tertiary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important; +} +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} +.bg-opacity-100 { + --bs-bg-opacity: 1; +} +.bg-primary-subtle { + background-color: var(--bs-primary-bg-subtle) !important; +} +.bg-secondary-subtle { + background-color: var(--bs-secondary-bg-subtle) !important; +} +.bg-success-subtle { + background-color: var(--bs-success-bg-subtle) !important; +} +.bg-info-subtle { + background-color: var(--bs-info-bg-subtle) !important; +} +.bg-warning-subtle { + background-color: var(--bs-warning-bg-subtle) !important; +} +.bg-danger-subtle { + background-color: var(--bs-danger-bg-subtle) !important; +} +.bg-light-subtle { + background-color: var(--bs-light-bg-subtle) !important; +} +.bg-dark-subtle { + background-color: var(--bs-dark-bg-subtle) !important; +} +.bg-gradient { + background-image: var(--bs-gradient) !important; +} +.user-select-all { + user-select: all !important; +} +.user-select-auto { + user-select: auto !important; +} +.user-select-none { + user-select: none !important; +} +.pe-none { + pointer-events: none !important; +} +.pe-auto { + pointer-events: auto !important; +} +.rounded { + border-radius: var(--bs-border-radius) !important; +} +.rounded-0 { + border-radius: 0 !important; +} +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; +} +.rounded-2 { + border-radius: var(--bs-border-radius) !important; +} +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; +} +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} +.rounded-5 { + border-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-circle { + border-radius: 50% !important; +} +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; +} +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} +.rounded-top-1 { + border-top-left-radius: var(--bs-border-radius-sm) !important; + border-top-right-radius: var(--bs-border-radius-sm) !important; +} +.rounded-top-2 { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} +.rounded-top-3 { + border-top-left-radius: var(--bs-border-radius-lg) !important; + border-top-right-radius: var(--bs-border-radius-lg) !important; +} +.rounded-top-4 { + border-top-left-radius: var(--bs-border-radius-xl) !important; + border-top-right-radius: var(--bs-border-radius-xl) !important; +} +.rounded-top-5 { + border-top-left-radius: var(--bs-border-radius-xxl) !important; + border-top-right-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-top-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; +} +.rounded-top-pill { + border-top-left-radius: var(--bs-border-radius-pill) !important; + border-top-right-radius: var(--bs-border-radius-pill) !important; +} +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} +.rounded-end-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.rounded-end-1 { + border-top-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-right-radius: var(--bs-border-radius-sm) !important; +} +.rounded-end-2 { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} +.rounded-end-3 { + border-top-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-right-radius: var(--bs-border-radius-lg) !important; +} +.rounded-end-4 { + border-top-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-right-radius: var(--bs-border-radius-xl) !important; +} +.rounded-end-5 { + border-top-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-end-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} +.rounded-end-pill { + border-top-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-right-radius: var(--bs-border-radius-pill) !important; +} +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} +.rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} +.rounded-bottom-1 { + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-left-radius: var(--bs-border-radius-sm) !important; +} +.rounded-bottom-2 { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} +.rounded-bottom-3 { + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-left-radius: var(--bs-border-radius-lg) !important; +} +.rounded-bottom-4 { + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-left-radius: var(--bs-border-radius-xl) !important; +} +.rounded-bottom-5 { + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-bottom-circle { + border-bottom-right-radius: 50% !important; + border-bottom-left-radius: 50% !important; +} +.rounded-bottom-pill { + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-left-radius: var(--bs-border-radius-pill) !important; +} +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} +.rounded-start-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; +} +.rounded-start-1 { + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + border-top-left-radius: var(--bs-border-radius-sm) !important; +} +.rounded-start-2 { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} +.rounded-start-3 { + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + border-top-left-radius: var(--bs-border-radius-lg) !important; +} +.rounded-start-4 { + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + border-top-left-radius: var(--bs-border-radius-xl) !important; +} +.rounded-start-5 { + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + border-top-left-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-start-circle { + border-bottom-left-radius: 50% !important; + border-top-left-radius: 50% !important; +} +.rounded-start-pill { + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + border-top-left-radius: var(--bs-border-radius-pill) !important; +} +.visible { + visibility: visible !important; +} +.invisible { + visibility: hidden !important; +} +.z-n1 { + z-index: -1 !important; +} +.z-0 { + z-index: 0 !important; +} +.z-1 { + z-index: 1 !important; +} +.z-2 { + z-index: 2 !important; +} +.z-3 { + z-index: 3 !important; +} +@media (min-width: 576px) { +.float-sm-start { + float: left !important; +} +.float-sm-end { + float: right !important; +} +.float-sm-none { + float: none !important; +} +.object-fit-sm-contain { + object-fit: contain !important; +} +.object-fit-sm-cover { + object-fit: cover !important; +} +.object-fit-sm-fill { + object-fit: fill !important; +} +.object-fit-sm-scale { + object-fit: scale-down !important; +} +.object-fit-sm-none { + object-fit: none !important; +} +.d-sm-inline { + display: inline !important; +} +.d-sm-inline-block { + display: inline-block !important; +} +.d-sm-block { + display: block !important; +} +.d-sm-grid { + display: grid !important; +} +.d-sm-inline-grid { + display: inline-grid !important; +} +.d-sm-table { + display: table !important; +} +.d-sm-table-row { + display: table-row !important; +} +.d-sm-table-cell { + display: table-cell !important; +} +.d-sm-flex { + display: flex !important; +} +.d-sm-inline-flex { + display: inline-flex !important; +} +.d-sm-none { + display: none !important; +} +.flex-sm-fill { + flex: 1 1 auto !important; +} +.flex-sm-row { + flex-direction: row !important; +} +.flex-sm-column { + flex-direction: column !important; +} +.flex-sm-row-reverse { + flex-direction: row-reverse !important; +} +.flex-sm-column-reverse { + flex-direction: column-reverse !important; +} +.flex-sm-grow-0 { + flex-grow: 0 !important; +} +.flex-sm-grow-1 { + flex-grow: 1 !important; +} +.flex-sm-shrink-0 { + flex-shrink: 0 !important; +} +.flex-sm-shrink-1 { + flex-shrink: 1 !important; +} +.flex-sm-wrap { + flex-wrap: wrap !important; +} +.flex-sm-nowrap { + flex-wrap: nowrap !important; +} +.flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; +} +.justify-content-sm-start { + justify-content: flex-start !important; +} +.justify-content-sm-end { + justify-content: flex-end !important; +} +.justify-content-sm-center { + justify-content: center !important; +} +.justify-content-sm-between { + justify-content: space-between !important; +} +.justify-content-sm-around { + justify-content: space-around !important; +} +.justify-content-sm-evenly { + justify-content: space-evenly !important; +} +.align-items-sm-start { + align-items: flex-start !important; +} +.align-items-sm-end { + align-items: flex-end !important; +} +.align-items-sm-center { + align-items: center !important; +} +.align-items-sm-baseline { + align-items: baseline !important; +} +.align-items-sm-stretch { + align-items: stretch !important; +} +.align-content-sm-start { + align-content: flex-start !important; +} +.align-content-sm-end { + align-content: flex-end !important; +} +.align-content-sm-center { + align-content: center !important; +} +.align-content-sm-between { + align-content: space-between !important; +} +.align-content-sm-around { + align-content: space-around !important; +} +.align-content-sm-stretch { + align-content: stretch !important; +} +.align-self-sm-auto { + align-self: auto !important; +} +.align-self-sm-start { + align-self: flex-start !important; +} +.align-self-sm-end { + align-self: flex-end !important; +} +.align-self-sm-center { + align-self: center !important; +} +.align-self-sm-baseline { + align-self: baseline !important; +} +.align-self-sm-stretch { + align-self: stretch !important; +} +.order-sm-first { + order: -1 !important; +} +.order-sm-0 { + order: 0 !important; +} +.order-sm-1 { + order: 1 !important; +} +.order-sm-2 { + order: 2 !important; +} +.order-sm-3 { + order: 3 !important; +} +.order-sm-4 { + order: 4 !important; +} +.order-sm-5 { + order: 5 !important; +} +.order-sm-last { + order: 6 !important; +} +.m-sm-0 { + margin: 0 !important; +} +.m-sm-1 { + margin: 0.25rem !important; +} +.m-sm-2 { + margin: 0.5rem !important; +} +.m-sm-3 { + margin: 1rem !important; +} +.m-sm-4 { + margin: 1.5rem !important; +} +.m-sm-5 { + margin: 3rem !important; +} +.m-sm-auto { + margin: auto !important; +} +.mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} +.mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} +.mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} +.mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} +.mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} +.mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; +} +.my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} +.my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} +.my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} +.my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} +.my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} +.my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} +.mt-sm-0 { + margin-top: 0 !important; +} +.mt-sm-1 { + margin-top: 0.25rem !important; +} +.mt-sm-2 { + margin-top: 0.5rem !important; +} +.mt-sm-3 { + margin-top: 1rem !important; +} +.mt-sm-4 { + margin-top: 1.5rem !important; +} +.mt-sm-5 { + margin-top: 3rem !important; +} +.mt-sm-auto { + margin-top: auto !important; +} +.me-sm-0 { + margin-right: 0 !important; +} +.me-sm-1 { + margin-right: 0.25rem !important; +} +.me-sm-2 { + margin-right: 0.5rem !important; +} +.me-sm-3 { + margin-right: 1rem !important; +} +.me-sm-4 { + margin-right: 1.5rem !important; +} +.me-sm-5 { + margin-right: 3rem !important; +} +.me-sm-auto { + margin-right: auto !important; +} +.mb-sm-0 { + margin-bottom: 0 !important; +} +.mb-sm-1 { + margin-bottom: 0.25rem !important; +} +.mb-sm-2 { + margin-bottom: 0.5rem !important; +} +.mb-sm-3 { + margin-bottom: 1rem !important; +} +.mb-sm-4 { + margin-bottom: 1.5rem !important; +} +.mb-sm-5 { + margin-bottom: 3rem !important; +} +.mb-sm-auto { + margin-bottom: auto !important; +} +.ms-sm-0 { + margin-left: 0 !important; +} +.ms-sm-1 { + margin-left: 0.25rem !important; +} +.ms-sm-2 { + margin-left: 0.5rem !important; +} +.ms-sm-3 { + margin-left: 1rem !important; +} +.ms-sm-4 { + margin-left: 1.5rem !important; +} +.ms-sm-5 { + margin-left: 3rem !important; +} +.ms-sm-auto { + margin-left: auto !important; +} +.p-sm-0 { + padding: 0 !important; +} +.p-sm-1 { + padding: 0.25rem !important; +} +.p-sm-2 { + padding: 0.5rem !important; +} +.p-sm-3 { + padding: 1rem !important; +} +.p-sm-4 { + padding: 1.5rem !important; +} +.p-sm-5 { + padding: 3rem !important; +} +.px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} +.px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} +.px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} +.px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} +.px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} +.py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} +.py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} +.py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} +.py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} +.py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} +.pt-sm-0 { + padding-top: 0 !important; +} +.pt-sm-1 { + padding-top: 0.25rem !important; +} +.pt-sm-2 { + padding-top: 0.5rem !important; +} +.pt-sm-3 { + padding-top: 1rem !important; +} +.pt-sm-4 { + padding-top: 1.5rem !important; +} +.pt-sm-5 { + padding-top: 3rem !important; +} +.pe-sm-0 { + padding-right: 0 !important; +} +.pe-sm-1 { + padding-right: 0.25rem !important; +} +.pe-sm-2 { + padding-right: 0.5rem !important; +} +.pe-sm-3 { + padding-right: 1rem !important; +} +.pe-sm-4 { + padding-right: 1.5rem !important; +} +.pe-sm-5 { + padding-right: 3rem !important; +} +.pb-sm-0 { + padding-bottom: 0 !important; +} +.pb-sm-1 { + padding-bottom: 0.25rem !important; +} +.pb-sm-2 { + padding-bottom: 0.5rem !important; +} +.pb-sm-3 { + padding-bottom: 1rem !important; +} +.pb-sm-4 { + padding-bottom: 1.5rem !important; +} +.pb-sm-5 { + padding-bottom: 3rem !important; +} +.ps-sm-0 { + padding-left: 0 !important; +} +.ps-sm-1 { + padding-left: 0.25rem !important; +} +.ps-sm-2 { + padding-left: 0.5rem !important; +} +.ps-sm-3 { + padding-left: 1rem !important; +} +.ps-sm-4 { + padding-left: 1.5rem !important; +} +.ps-sm-5 { + padding-left: 3rem !important; +} +.gap-sm-0 { + gap: 0 !important; +} +.gap-sm-1 { + gap: 0.25rem !important; +} +.gap-sm-2 { + gap: 0.5rem !important; +} +.gap-sm-3 { + gap: 1rem !important; +} +.gap-sm-4 { + gap: 1.5rem !important; +} +.gap-sm-5 { + gap: 3rem !important; +} +.row-gap-sm-0 { + row-gap: 0 !important; +} +.row-gap-sm-1 { + row-gap: 0.25rem !important; +} +.row-gap-sm-2 { + row-gap: 0.5rem !important; +} +.row-gap-sm-3 { + row-gap: 1rem !important; +} +.row-gap-sm-4 { + row-gap: 1.5rem !important; +} +.row-gap-sm-5 { + row-gap: 3rem !important; +} +.column-gap-sm-0 { + column-gap: 0 !important; +} +.column-gap-sm-1 { + column-gap: 0.25rem !important; +} +.column-gap-sm-2 { + column-gap: 0.5rem !important; +} +.column-gap-sm-3 { + column-gap: 1rem !important; +} +.column-gap-sm-4 { + column-gap: 1.5rem !important; +} +.column-gap-sm-5 { + column-gap: 3rem !important; +} +.text-sm-start { + text-align: left !important; +} +.text-sm-end { + text-align: right !important; +} +.text-sm-center { + text-align: center !important; +} +} +@media (min-width: 768px) { +.float-md-start { + float: left !important; +} +.float-md-end { + float: right !important; +} +.float-md-none { + float: none !important; +} +.object-fit-md-contain { + object-fit: contain !important; +} +.object-fit-md-cover { + object-fit: cover !important; +} +.object-fit-md-fill { + object-fit: fill !important; +} +.object-fit-md-scale { + object-fit: scale-down !important; +} +.object-fit-md-none { + object-fit: none !important; +} +.d-md-inline { + display: inline !important; +} +.d-md-inline-block { + display: inline-block !important; +} +.d-md-block { + display: block !important; +} +.d-md-grid { + display: grid !important; +} +.d-md-inline-grid { + display: inline-grid !important; +} +.d-md-table { + display: table !important; +} +.d-md-table-row { + display: table-row !important; +} +.d-md-table-cell { + display: table-cell !important; +} +.d-md-flex { + display: flex !important; +} +.d-md-inline-flex { + display: inline-flex !important; +} +.d-md-none { + display: none !important; +} +.flex-md-fill { + flex: 1 1 auto !important; +} +.flex-md-row { + flex-direction: row !important; +} +.flex-md-column { + flex-direction: column !important; +} +.flex-md-row-reverse { + flex-direction: row-reverse !important; +} +.flex-md-column-reverse { + flex-direction: column-reverse !important; +} +.flex-md-grow-0 { + flex-grow: 0 !important; +} +.flex-md-grow-1 { + flex-grow: 1 !important; +} +.flex-md-shrink-0 { + flex-shrink: 0 !important; +} +.flex-md-shrink-1 { + flex-shrink: 1 !important; +} +.flex-md-wrap { + flex-wrap: wrap !important; +} +.flex-md-nowrap { + flex-wrap: nowrap !important; +} +.flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; +} +.justify-content-md-start { + justify-content: flex-start !important; +} +.justify-content-md-end { + justify-content: flex-end !important; +} +.justify-content-md-center { + justify-content: center !important; +} +.justify-content-md-between { + justify-content: space-between !important; +} +.justify-content-md-around { + justify-content: space-around !important; +} +.justify-content-md-evenly { + justify-content: space-evenly !important; +} +.align-items-md-start { + align-items: flex-start !important; +} +.align-items-md-end { + align-items: flex-end !important; +} +.align-items-md-center { + align-items: center !important; +} +.align-items-md-baseline { + align-items: baseline !important; +} +.align-items-md-stretch { + align-items: stretch !important; +} +.align-content-md-start { + align-content: flex-start !important; +} +.align-content-md-end { + align-content: flex-end !important; +} +.align-content-md-center { + align-content: center !important; +} +.align-content-md-between { + align-content: space-between !important; +} +.align-content-md-around { + align-content: space-around !important; +} +.align-content-md-stretch { + align-content: stretch !important; +} +.align-self-md-auto { + align-self: auto !important; +} +.align-self-md-start { + align-self: flex-start !important; +} +.align-self-md-end { + align-self: flex-end !important; +} +.align-self-md-center { + align-self: center !important; +} +.align-self-md-baseline { + align-self: baseline !important; +} +.align-self-md-stretch { + align-self: stretch !important; +} +.order-md-first { + order: -1 !important; +} +.order-md-0 { + order: 0 !important; +} +.order-md-1 { + order: 1 !important; +} +.order-md-2 { + order: 2 !important; +} +.order-md-3 { + order: 3 !important; +} +.order-md-4 { + order: 4 !important; +} +.order-md-5 { + order: 5 !important; +} +.order-md-last { + order: 6 !important; +} +.m-md-0 { + margin: 0 !important; +} +.m-md-1 { + margin: 0.25rem !important; +} +.m-md-2 { + margin: 0.5rem !important; +} +.m-md-3 { + margin: 1rem !important; +} +.m-md-4 { + margin: 1.5rem !important; +} +.m-md-5 { + margin: 3rem !important; +} +.m-md-auto { + margin: auto !important; +} +.mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} +.mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} +.mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} +.mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} +.mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} +.mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; +} +.my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} +.my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} +.my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} +.my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} +.my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} +.my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} +.mt-md-0 { + margin-top: 0 !important; +} +.mt-md-1 { + margin-top: 0.25rem !important; +} +.mt-md-2 { + margin-top: 0.5rem !important; +} +.mt-md-3 { + margin-top: 1rem !important; +} +.mt-md-4 { + margin-top: 1.5rem !important; +} +.mt-md-5 { + margin-top: 3rem !important; +} +.mt-md-auto { + margin-top: auto !important; +} +.me-md-0 { + margin-right: 0 !important; +} +.me-md-1 { + margin-right: 0.25rem !important; +} +.me-md-2 { + margin-right: 0.5rem !important; +} +.me-md-3 { + margin-right: 1rem !important; +} +.me-md-4 { + margin-right: 1.5rem !important; +} +.me-md-5 { + margin-right: 3rem !important; +} +.me-md-auto { + margin-right: auto !important; +} +.mb-md-0 { + margin-bottom: 0 !important; +} +.mb-md-1 { + margin-bottom: 0.25rem !important; +} +.mb-md-2 { + margin-bottom: 0.5rem !important; +} +.mb-md-3 { + margin-bottom: 1rem !important; +} +.mb-md-4 { + margin-bottom: 1.5rem !important; +} +.mb-md-5 { + margin-bottom: 3rem !important; +} +.mb-md-auto { + margin-bottom: auto !important; +} +.ms-md-0 { + margin-left: 0 !important; +} +.ms-md-1 { + margin-left: 0.25rem !important; +} +.ms-md-2 { + margin-left: 0.5rem !important; +} +.ms-md-3 { + margin-left: 1rem !important; +} +.ms-md-4 { + margin-left: 1.5rem !important; +} +.ms-md-5 { + margin-left: 3rem !important; +} +.ms-md-auto { + margin-left: auto !important; +} +.p-md-0 { + padding: 0 !important; +} +.p-md-1 { + padding: 0.25rem !important; +} +.p-md-2 { + padding: 0.5rem !important; +} +.p-md-3 { + padding: 1rem !important; +} +.p-md-4 { + padding: 1.5rem !important; +} +.p-md-5 { + padding: 3rem !important; +} +.px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} +.px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} +.px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} +.px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} +.px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} +.py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} +.py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} +.py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} +.py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} +.py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} +.pt-md-0 { + padding-top: 0 !important; +} +.pt-md-1 { + padding-top: 0.25rem !important; +} +.pt-md-2 { + padding-top: 0.5rem !important; +} +.pt-md-3 { + padding-top: 1rem !important; +} +.pt-md-4 { + padding-top: 1.5rem !important; +} +.pt-md-5 { + padding-top: 3rem !important; +} +.pe-md-0 { + padding-right: 0 !important; +} +.pe-md-1 { + padding-right: 0.25rem !important; +} +.pe-md-2 { + padding-right: 0.5rem !important; +} +.pe-md-3 { + padding-right: 1rem !important; +} +.pe-md-4 { + padding-right: 1.5rem !important; +} +.pe-md-5 { + padding-right: 3rem !important; +} +.pb-md-0 { + padding-bottom: 0 !important; +} +.pb-md-1 { + padding-bottom: 0.25rem !important; +} +.pb-md-2 { + padding-bottom: 0.5rem !important; +} +.pb-md-3 { + padding-bottom: 1rem !important; +} +.pb-md-4 { + padding-bottom: 1.5rem !important; +} +.pb-md-5 { + padding-bottom: 3rem !important; +} +.ps-md-0 { + padding-left: 0 !important; +} +.ps-md-1 { + padding-left: 0.25rem !important; +} +.ps-md-2 { + padding-left: 0.5rem !important; +} +.ps-md-3 { + padding-left: 1rem !important; +} +.ps-md-4 { + padding-left: 1.5rem !important; +} +.ps-md-5 { + padding-left: 3rem !important; +} +.gap-md-0 { + gap: 0 !important; +} +.gap-md-1 { + gap: 0.25rem !important; +} +.gap-md-2 { + gap: 0.5rem !important; +} +.gap-md-3 { + gap: 1rem !important; +} +.gap-md-4 { + gap: 1.5rem !important; +} +.gap-md-5 { + gap: 3rem !important; +} +.row-gap-md-0 { + row-gap: 0 !important; +} +.row-gap-md-1 { + row-gap: 0.25rem !important; +} +.row-gap-md-2 { + row-gap: 0.5rem !important; +} +.row-gap-md-3 { + row-gap: 1rem !important; +} +.row-gap-md-4 { + row-gap: 1.5rem !important; +} +.row-gap-md-5 { + row-gap: 3rem !important; +} +.column-gap-md-0 { + column-gap: 0 !important; +} +.column-gap-md-1 { + column-gap: 0.25rem !important; +} +.column-gap-md-2 { + column-gap: 0.5rem !important; +} +.column-gap-md-3 { + column-gap: 1rem !important; +} +.column-gap-md-4 { + column-gap: 1.5rem !important; +} +.column-gap-md-5 { + column-gap: 3rem !important; +} +.text-md-start { + text-align: left !important; +} +.text-md-end { + text-align: right !important; +} +.text-md-center { + text-align: center !important; +} +} +@media (min-width: 992px) { +.float-lg-start { + float: left !important; +} +.float-lg-end { + float: right !important; +} +.float-lg-none { + float: none !important; +} +.object-fit-lg-contain { + object-fit: contain !important; +} +.object-fit-lg-cover { + object-fit: cover !important; +} +.object-fit-lg-fill { + object-fit: fill !important; +} +.object-fit-lg-scale { + object-fit: scale-down !important; +} +.object-fit-lg-none { + object-fit: none !important; +} +.d-lg-inline { + display: inline !important; +} +.d-lg-inline-block { + display: inline-block !important; +} +.d-lg-block { + display: block !important; +} +.d-lg-grid { + display: grid !important; +} +.d-lg-inline-grid { + display: inline-grid !important; +} +.d-lg-table { + display: table !important; +} +.d-lg-table-row { + display: table-row !important; +} +.d-lg-table-cell { + display: table-cell !important; +} +.d-lg-flex { + display: flex !important; +} +.d-lg-inline-flex { + display: inline-flex !important; +} +.d-lg-none { + display: none !important; +} +.flex-lg-fill { + flex: 1 1 auto !important; +} +.flex-lg-row { + flex-direction: row !important; +} +.flex-lg-column { + flex-direction: column !important; +} +.flex-lg-row-reverse { + flex-direction: row-reverse !important; +} +.flex-lg-column-reverse { + flex-direction: column-reverse !important; +} +.flex-lg-grow-0 { + flex-grow: 0 !important; +} +.flex-lg-grow-1 { + flex-grow: 1 !important; +} +.flex-lg-shrink-0 { + flex-shrink: 0 !important; +} +.flex-lg-shrink-1 { + flex-shrink: 1 !important; +} +.flex-lg-wrap { + flex-wrap: wrap !important; +} +.flex-lg-nowrap { + flex-wrap: nowrap !important; +} +.flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; +} +.justify-content-lg-start { + justify-content: flex-start !important; +} +.justify-content-lg-end { + justify-content: flex-end !important; +} +.justify-content-lg-center { + justify-content: center !important; +} +.justify-content-lg-between { + justify-content: space-between !important; +} +.justify-content-lg-around { + justify-content: space-around !important; +} +.justify-content-lg-evenly { + justify-content: space-evenly !important; +} +.align-items-lg-start { + align-items: flex-start !important; +} +.align-items-lg-end { + align-items: flex-end !important; +} +.align-items-lg-center { + align-items: center !important; +} +.align-items-lg-baseline { + align-items: baseline !important; +} +.align-items-lg-stretch { + align-items: stretch !important; +} +.align-content-lg-start { + align-content: flex-start !important; +} +.align-content-lg-end { + align-content: flex-end !important; +} +.align-content-lg-center { + align-content: center !important; +} +.align-content-lg-between { + align-content: space-between !important; +} +.align-content-lg-around { + align-content: space-around !important; +} +.align-content-lg-stretch { + align-content: stretch !important; +} +.align-self-lg-auto { + align-self: auto !important; +} +.align-self-lg-start { + align-self: flex-start !important; +} +.align-self-lg-end { + align-self: flex-end !important; +} +.align-self-lg-center { + align-self: center !important; +} +.align-self-lg-baseline { + align-self: baseline !important; +} +.align-self-lg-stretch { + align-self: stretch !important; +} +.order-lg-first { + order: -1 !important; +} +.order-lg-0 { + order: 0 !important; +} +.order-lg-1 { + order: 1 !important; +} +.order-lg-2 { + order: 2 !important; +} +.order-lg-3 { + order: 3 !important; +} +.order-lg-4 { + order: 4 !important; +} +.order-lg-5 { + order: 5 !important; +} +.order-lg-last { + order: 6 !important; +} +.m-lg-0 { + margin: 0 !important; +} +.m-lg-1 { + margin: 0.25rem !important; +} +.m-lg-2 { + margin: 0.5rem !important; +} +.m-lg-3 { + margin: 1rem !important; +} +.m-lg-4 { + margin: 1.5rem !important; +} +.m-lg-5 { + margin: 3rem !important; +} +.m-lg-auto { + margin: auto !important; +} +.mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} +.mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} +.mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} +.mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} +.mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} +.mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; +} +.my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} +.my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} +.my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} +.my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} +.my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} +.my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} +.mt-lg-0 { + margin-top: 0 !important; +} +.mt-lg-1 { + margin-top: 0.25rem !important; +} +.mt-lg-2 { + margin-top: 0.5rem !important; +} +.mt-lg-3 { + margin-top: 1rem !important; +} +.mt-lg-4 { + margin-top: 1.5rem !important; +} +.mt-lg-5 { + margin-top: 3rem !important; +} +.mt-lg-auto { + margin-top: auto !important; +} +.me-lg-0 { + margin-right: 0 !important; +} +.me-lg-1 { + margin-right: 0.25rem !important; +} +.me-lg-2 { + margin-right: 0.5rem !important; +} +.me-lg-3 { + margin-right: 1rem !important; +} +.me-lg-4 { + margin-right: 1.5rem !important; +} +.me-lg-5 { + margin-right: 3rem !important; +} +.me-lg-auto { + margin-right: auto !important; +} +.mb-lg-0 { + margin-bottom: 0 !important; +} +.mb-lg-1 { + margin-bottom: 0.25rem !important; +} +.mb-lg-2 { + margin-bottom: 0.5rem !important; +} +.mb-lg-3 { + margin-bottom: 1rem !important; +} +.mb-lg-4 { + margin-bottom: 1.5rem !important; +} +.mb-lg-5 { + margin-bottom: 3rem !important; +} +.mb-lg-auto { + margin-bottom: auto !important; +} +.ms-lg-0 { + margin-left: 0 !important; +} +.ms-lg-1 { + margin-left: 0.25rem !important; +} +.ms-lg-2 { + margin-left: 0.5rem !important; +} +.ms-lg-3 { + margin-left: 1rem !important; +} +.ms-lg-4 { + margin-left: 1.5rem !important; +} +.ms-lg-5 { + margin-left: 3rem !important; +} +.ms-lg-auto { + margin-left: auto !important; +} +.p-lg-0 { + padding: 0 !important; +} +.p-lg-1 { + padding: 0.25rem !important; +} +.p-lg-2 { + padding: 0.5rem !important; +} +.p-lg-3 { + padding: 1rem !important; +} +.p-lg-4 { + padding: 1.5rem !important; +} +.p-lg-5 { + padding: 3rem !important; +} +.px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} +.px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} +.px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} +.px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} +.px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} +.py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} +.py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} +.py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} +.py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} +.py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} +.pt-lg-0 { + padding-top: 0 !important; +} +.pt-lg-1 { + padding-top: 0.25rem !important; +} +.pt-lg-2 { + padding-top: 0.5rem !important; +} +.pt-lg-3 { + padding-top: 1rem !important; +} +.pt-lg-4 { + padding-top: 1.5rem !important; +} +.pt-lg-5 { + padding-top: 3rem !important; +} +.pe-lg-0 { + padding-right: 0 !important; +} +.pe-lg-1 { + padding-right: 0.25rem !important; +} +.pe-lg-2 { + padding-right: 0.5rem !important; +} +.pe-lg-3 { + padding-right: 1rem !important; +} +.pe-lg-4 { + padding-right: 1.5rem !important; +} +.pe-lg-5 { + padding-right: 3rem !important; +} +.pb-lg-0 { + padding-bottom: 0 !important; +} +.pb-lg-1 { + padding-bottom: 0.25rem !important; +} +.pb-lg-2 { + padding-bottom: 0.5rem !important; +} +.pb-lg-3 { + padding-bottom: 1rem !important; +} +.pb-lg-4 { + padding-bottom: 1.5rem !important; +} +.pb-lg-5 { + padding-bottom: 3rem !important; +} +.ps-lg-0 { + padding-left: 0 !important; +} +.ps-lg-1 { + padding-left: 0.25rem !important; +} +.ps-lg-2 { + padding-left: 0.5rem !important; +} +.ps-lg-3 { + padding-left: 1rem !important; +} +.ps-lg-4 { + padding-left: 1.5rem !important; +} +.ps-lg-5 { + padding-left: 3rem !important; +} +.gap-lg-0 { + gap: 0 !important; +} +.gap-lg-1 { + gap: 0.25rem !important; +} +.gap-lg-2 { + gap: 0.5rem !important; +} +.gap-lg-3 { + gap: 1rem !important; +} +.gap-lg-4 { + gap: 1.5rem !important; +} +.gap-lg-5 { + gap: 3rem !important; +} +.row-gap-lg-0 { + row-gap: 0 !important; +} +.row-gap-lg-1 { + row-gap: 0.25rem !important; +} +.row-gap-lg-2 { + row-gap: 0.5rem !important; +} +.row-gap-lg-3 { + row-gap: 1rem !important; +} +.row-gap-lg-4 { + row-gap: 1.5rem !important; +} +.row-gap-lg-5 { + row-gap: 3rem !important; +} +.column-gap-lg-0 { + column-gap: 0 !important; +} +.column-gap-lg-1 { + column-gap: 0.25rem !important; +} +.column-gap-lg-2 { + column-gap: 0.5rem !important; +} +.column-gap-lg-3 { + column-gap: 1rem !important; +} +.column-gap-lg-4 { + column-gap: 1.5rem !important; +} +.column-gap-lg-5 { + column-gap: 3rem !important; +} +.text-lg-start { + text-align: left !important; +} +.text-lg-end { + text-align: right !important; +} +.text-lg-center { + text-align: center !important; +} +} +@media (min-width: 1200px) { +.float-xl-start { + float: left !important; +} +.float-xl-end { + float: right !important; +} +.float-xl-none { + float: none !important; +} +.object-fit-xl-contain { + object-fit: contain !important; +} +.object-fit-xl-cover { + object-fit: cover !important; +} +.object-fit-xl-fill { + object-fit: fill !important; +} +.object-fit-xl-scale { + object-fit: scale-down !important; +} +.object-fit-xl-none { + object-fit: none !important; +} +.d-xl-inline { + display: inline !important; +} +.d-xl-inline-block { + display: inline-block !important; +} +.d-xl-block { + display: block !important; +} +.d-xl-grid { + display: grid !important; +} +.d-xl-inline-grid { + display: inline-grid !important; +} +.d-xl-table { + display: table !important; +} +.d-xl-table-row { + display: table-row !important; +} +.d-xl-table-cell { + display: table-cell !important; +} +.d-xl-flex { + display: flex !important; +} +.d-xl-inline-flex { + display: inline-flex !important; +} +.d-xl-none { + display: none !important; +} +.flex-xl-fill { + flex: 1 1 auto !important; +} +.flex-xl-row { + flex-direction: row !important; +} +.flex-xl-column { + flex-direction: column !important; +} +.flex-xl-row-reverse { + flex-direction: row-reverse !important; +} +.flex-xl-column-reverse { + flex-direction: column-reverse !important; +} +.flex-xl-grow-0 { + flex-grow: 0 !important; +} +.flex-xl-grow-1 { + flex-grow: 1 !important; +} +.flex-xl-shrink-0 { + flex-shrink: 0 !important; +} +.flex-xl-shrink-1 { + flex-shrink: 1 !important; +} +.flex-xl-wrap { + flex-wrap: wrap !important; +} +.flex-xl-nowrap { + flex-wrap: nowrap !important; +} +.flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; +} +.justify-content-xl-start { + justify-content: flex-start !important; +} +.justify-content-xl-end { + justify-content: flex-end !important; +} +.justify-content-xl-center { + justify-content: center !important; +} +.justify-content-xl-between { + justify-content: space-between !important; +} +.justify-content-xl-around { + justify-content: space-around !important; +} +.justify-content-xl-evenly { + justify-content: space-evenly !important; +} +.align-items-xl-start { + align-items: flex-start !important; +} +.align-items-xl-end { + align-items: flex-end !important; +} +.align-items-xl-center { + align-items: center !important; +} +.align-items-xl-baseline { + align-items: baseline !important; +} +.align-items-xl-stretch { + align-items: stretch !important; +} +.align-content-xl-start { + align-content: flex-start !important; +} +.align-content-xl-end { + align-content: flex-end !important; +} +.align-content-xl-center { + align-content: center !important; +} +.align-content-xl-between { + align-content: space-between !important; +} +.align-content-xl-around { + align-content: space-around !important; +} +.align-content-xl-stretch { + align-content: stretch !important; +} +.align-self-xl-auto { + align-self: auto !important; +} +.align-self-xl-start { + align-self: flex-start !important; +} +.align-self-xl-end { + align-self: flex-end !important; +} +.align-self-xl-center { + align-self: center !important; +} +.align-self-xl-baseline { + align-self: baseline !important; +} +.align-self-xl-stretch { + align-self: stretch !important; +} +.order-xl-first { + order: -1 !important; +} +.order-xl-0 { + order: 0 !important; +} +.order-xl-1 { + order: 1 !important; +} +.order-xl-2 { + order: 2 !important; +} +.order-xl-3 { + order: 3 !important; +} +.order-xl-4 { + order: 4 !important; +} +.order-xl-5 { + order: 5 !important; +} +.order-xl-last { + order: 6 !important; +} +.m-xl-0 { + margin: 0 !important; +} +.m-xl-1 { + margin: 0.25rem !important; +} +.m-xl-2 { + margin: 0.5rem !important; +} +.m-xl-3 { + margin: 1rem !important; +} +.m-xl-4 { + margin: 1.5rem !important; +} +.m-xl-5 { + margin: 3rem !important; +} +.m-xl-auto { + margin: auto !important; +} +.mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} +.mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} +.mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} +.mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} +.mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} +.mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; +} +.my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} +.my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} +.my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} +.my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} +.my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} +.my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} +.mt-xl-0 { + margin-top: 0 !important; +} +.mt-xl-1 { + margin-top: 0.25rem !important; +} +.mt-xl-2 { + margin-top: 0.5rem !important; +} +.mt-xl-3 { + margin-top: 1rem !important; +} +.mt-xl-4 { + margin-top: 1.5rem !important; +} +.mt-xl-5 { + margin-top: 3rem !important; +} +.mt-xl-auto { + margin-top: auto !important; +} +.me-xl-0 { + margin-right: 0 !important; +} +.me-xl-1 { + margin-right: 0.25rem !important; +} +.me-xl-2 { + margin-right: 0.5rem !important; +} +.me-xl-3 { + margin-right: 1rem !important; +} +.me-xl-4 { + margin-right: 1.5rem !important; +} +.me-xl-5 { + margin-right: 3rem !important; +} +.me-xl-auto { + margin-right: auto !important; +} +.mb-xl-0 { + margin-bottom: 0 !important; +} +.mb-xl-1 { + margin-bottom: 0.25rem !important; +} +.mb-xl-2 { + margin-bottom: 0.5rem !important; +} +.mb-xl-3 { + margin-bottom: 1rem !important; +} +.mb-xl-4 { + margin-bottom: 1.5rem !important; +} +.mb-xl-5 { + margin-bottom: 3rem !important; +} +.mb-xl-auto { + margin-bottom: auto !important; +} +.ms-xl-0 { + margin-left: 0 !important; +} +.ms-xl-1 { + margin-left: 0.25rem !important; +} +.ms-xl-2 { + margin-left: 0.5rem !important; +} +.ms-xl-3 { + margin-left: 1rem !important; +} +.ms-xl-4 { + margin-left: 1.5rem !important; +} +.ms-xl-5 { + margin-left: 3rem !important; +} +.ms-xl-auto { + margin-left: auto !important; +} +.p-xl-0 { + padding: 0 !important; +} +.p-xl-1 { + padding: 0.25rem !important; +} +.p-xl-2 { + padding: 0.5rem !important; +} +.p-xl-3 { + padding: 1rem !important; +} +.p-xl-4 { + padding: 1.5rem !important; +} +.p-xl-5 { + padding: 3rem !important; +} +.px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} +.px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} +.px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} +.px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} +.px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} +.py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} +.py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} +.py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} +.py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} +.py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} +.pt-xl-0 { + padding-top: 0 !important; +} +.pt-xl-1 { + padding-top: 0.25rem !important; +} +.pt-xl-2 { + padding-top: 0.5rem !important; +} +.pt-xl-3 { + padding-top: 1rem !important; +} +.pt-xl-4 { + padding-top: 1.5rem !important; +} +.pt-xl-5 { + padding-top: 3rem !important; +} +.pe-xl-0 { + padding-right: 0 !important; +} +.pe-xl-1 { + padding-right: 0.25rem !important; +} +.pe-xl-2 { + padding-right: 0.5rem !important; +} +.pe-xl-3 { + padding-right: 1rem !important; +} +.pe-xl-4 { + padding-right: 1.5rem !important; +} +.pe-xl-5 { + padding-right: 3rem !important; +} +.pb-xl-0 { + padding-bottom: 0 !important; +} +.pb-xl-1 { + padding-bottom: 0.25rem !important; +} +.pb-xl-2 { + padding-bottom: 0.5rem !important; +} +.pb-xl-3 { + padding-bottom: 1rem !important; +} +.pb-xl-4 { + padding-bottom: 1.5rem !important; +} +.pb-xl-5 { + padding-bottom: 3rem !important; +} +.ps-xl-0 { + padding-left: 0 !important; +} +.ps-xl-1 { + padding-left: 0.25rem !important; +} +.ps-xl-2 { + padding-left: 0.5rem !important; +} +.ps-xl-3 { + padding-left: 1rem !important; +} +.ps-xl-4 { + padding-left: 1.5rem !important; +} +.ps-xl-5 { + padding-left: 3rem !important; +} +.gap-xl-0 { + gap: 0 !important; +} +.gap-xl-1 { + gap: 0.25rem !important; +} +.gap-xl-2 { + gap: 0.5rem !important; +} +.gap-xl-3 { + gap: 1rem !important; +} +.gap-xl-4 { + gap: 1.5rem !important; +} +.gap-xl-5 { + gap: 3rem !important; +} +.row-gap-xl-0 { + row-gap: 0 !important; +} +.row-gap-xl-1 { + row-gap: 0.25rem !important; +} +.row-gap-xl-2 { + row-gap: 0.5rem !important; +} +.row-gap-xl-3 { + row-gap: 1rem !important; +} +.row-gap-xl-4 { + row-gap: 1.5rem !important; +} +.row-gap-xl-5 { + row-gap: 3rem !important; +} +.column-gap-xl-0 { + column-gap: 0 !important; +} +.column-gap-xl-1 { + column-gap: 0.25rem !important; +} +.column-gap-xl-2 { + column-gap: 0.5rem !important; +} +.column-gap-xl-3 { + column-gap: 1rem !important; +} +.column-gap-xl-4 { + column-gap: 1.5rem !important; +} +.column-gap-xl-5 { + column-gap: 3rem !important; +} +.text-xl-start { + text-align: left !important; +} +.text-xl-end { + text-align: right !important; +} +.text-xl-center { + text-align: center !important; +} +} +@media (min-width: 1400px) { +.float-xxl-start { + float: left !important; +} +.float-xxl-end { + float: right !important; +} +.float-xxl-none { + float: none !important; +} +.object-fit-xxl-contain { + object-fit: contain !important; +} +.object-fit-xxl-cover { + object-fit: cover !important; +} +.object-fit-xxl-fill { + object-fit: fill !important; +} +.object-fit-xxl-scale { + object-fit: scale-down !important; +} +.object-fit-xxl-none { + object-fit: none !important; +} +.d-xxl-inline { + display: inline !important; +} +.d-xxl-inline-block { + display: inline-block !important; +} +.d-xxl-block { + display: block !important; +} +.d-xxl-grid { + display: grid !important; +} +.d-xxl-inline-grid { + display: inline-grid !important; +} +.d-xxl-table { + display: table !important; +} +.d-xxl-table-row { + display: table-row !important; +} +.d-xxl-table-cell { + display: table-cell !important; +} +.d-xxl-flex { + display: flex !important; +} +.d-xxl-inline-flex { + display: inline-flex !important; +} +.d-xxl-none { + display: none !important; +} +.flex-xxl-fill { + flex: 1 1 auto !important; +} +.flex-xxl-row { + flex-direction: row !important; +} +.flex-xxl-column { + flex-direction: column !important; +} +.flex-xxl-row-reverse { + flex-direction: row-reverse !important; +} +.flex-xxl-column-reverse { + flex-direction: column-reverse !important; +} +.flex-xxl-grow-0 { + flex-grow: 0 !important; +} +.flex-xxl-grow-1 { + flex-grow: 1 !important; +} +.flex-xxl-shrink-0 { + flex-shrink: 0 !important; +} +.flex-xxl-shrink-1 { + flex-shrink: 1 !important; +} +.flex-xxl-wrap { + flex-wrap: wrap !important; +} +.flex-xxl-nowrap { + flex-wrap: nowrap !important; +} +.flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; +} +.justify-content-xxl-start { + justify-content: flex-start !important; +} +.justify-content-xxl-end { + justify-content: flex-end !important; +} +.justify-content-xxl-center { + justify-content: center !important; +} +.justify-content-xxl-between { + justify-content: space-between !important; +} +.justify-content-xxl-around { + justify-content: space-around !important; +} +.justify-content-xxl-evenly { + justify-content: space-evenly !important; +} +.align-items-xxl-start { + align-items: flex-start !important; +} +.align-items-xxl-end { + align-items: flex-end !important; +} +.align-items-xxl-center { + align-items: center !important; +} +.align-items-xxl-baseline { + align-items: baseline !important; +} +.align-items-xxl-stretch { + align-items: stretch !important; +} +.align-content-xxl-start { + align-content: flex-start !important; +} +.align-content-xxl-end { + align-content: flex-end !important; +} +.align-content-xxl-center { + align-content: center !important; +} +.align-content-xxl-between { + align-content: space-between !important; +} +.align-content-xxl-around { + align-content: space-around !important; +} +.align-content-xxl-stretch { + align-content: stretch !important; +} +.align-self-xxl-auto { + align-self: auto !important; +} +.align-self-xxl-start { + align-self: flex-start !important; +} +.align-self-xxl-end { + align-self: flex-end !important; +} +.align-self-xxl-center { + align-self: center !important; +} +.align-self-xxl-baseline { + align-self: baseline !important; +} +.align-self-xxl-stretch { + align-self: stretch !important; +} +.order-xxl-first { + order: -1 !important; +} +.order-xxl-0 { + order: 0 !important; +} +.order-xxl-1 { + order: 1 !important; +} +.order-xxl-2 { + order: 2 !important; +} +.order-xxl-3 { + order: 3 !important; +} +.order-xxl-4 { + order: 4 !important; +} +.order-xxl-5 { + order: 5 !important; +} +.order-xxl-last { + order: 6 !important; +} +.m-xxl-0 { + margin: 0 !important; +} +.m-xxl-1 { + margin: 0.25rem !important; +} +.m-xxl-2 { + margin: 0.5rem !important; +} +.m-xxl-3 { + margin: 1rem !important; +} +.m-xxl-4 { + margin: 1.5rem !important; +} +.m-xxl-5 { + margin: 3rem !important; +} +.m-xxl-auto { + margin: auto !important; +} +.mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} +.mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} +.mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} +.mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} +.mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} +.mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; +} +.my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} +.my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} +.my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} +.my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} +.my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} +.my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} +.mt-xxl-0 { + margin-top: 0 !important; +} +.mt-xxl-1 { + margin-top: 0.25rem !important; +} +.mt-xxl-2 { + margin-top: 0.5rem !important; +} +.mt-xxl-3 { + margin-top: 1rem !important; +} +.mt-xxl-4 { + margin-top: 1.5rem !important; +} +.mt-xxl-5 { + margin-top: 3rem !important; +} +.mt-xxl-auto { + margin-top: auto !important; +} +.me-xxl-0 { + margin-right: 0 !important; +} +.me-xxl-1 { + margin-right: 0.25rem !important; +} +.me-xxl-2 { + margin-right: 0.5rem !important; +} +.me-xxl-3 { + margin-right: 1rem !important; +} +.me-xxl-4 { + margin-right: 1.5rem !important; +} +.me-xxl-5 { + margin-right: 3rem !important; +} +.me-xxl-auto { + margin-right: auto !important; +} +.mb-xxl-0 { + margin-bottom: 0 !important; +} +.mb-xxl-1 { + margin-bottom: 0.25rem !important; +} +.mb-xxl-2 { + margin-bottom: 0.5rem !important; +} +.mb-xxl-3 { + margin-bottom: 1rem !important; +} +.mb-xxl-4 { + margin-bottom: 1.5rem !important; +} +.mb-xxl-5 { + margin-bottom: 3rem !important; +} +.mb-xxl-auto { + margin-bottom: auto !important; +} +.ms-xxl-0 { + margin-left: 0 !important; +} +.ms-xxl-1 { + margin-left: 0.25rem !important; +} +.ms-xxl-2 { + margin-left: 0.5rem !important; +} +.ms-xxl-3 { + margin-left: 1rem !important; +} +.ms-xxl-4 { + margin-left: 1.5rem !important; +} +.ms-xxl-5 { + margin-left: 3rem !important; +} +.ms-xxl-auto { + margin-left: auto !important; +} +.p-xxl-0 { + padding: 0 !important; +} +.p-xxl-1 { + padding: 0.25rem !important; +} +.p-xxl-2 { + padding: 0.5rem !important; +} +.p-xxl-3 { + padding: 1rem !important; +} +.p-xxl-4 { + padding: 1.5rem !important; +} +.p-xxl-5 { + padding: 3rem !important; +} +.px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} +.px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} +.px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} +.px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} +.px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} +.py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} +.py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} +.py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} +.py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} +.py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} +.pt-xxl-0 { + padding-top: 0 !important; +} +.pt-xxl-1 { + padding-top: 0.25rem !important; +} +.pt-xxl-2 { + padding-top: 0.5rem !important; +} +.pt-xxl-3 { + padding-top: 1rem !important; +} +.pt-xxl-4 { + padding-top: 1.5rem !important; +} +.pt-xxl-5 { + padding-top: 3rem !important; +} +.pe-xxl-0 { + padding-right: 0 !important; +} +.pe-xxl-1 { + padding-right: 0.25rem !important; +} +.pe-xxl-2 { + padding-right: 0.5rem !important; +} +.pe-xxl-3 { + padding-right: 1rem !important; +} +.pe-xxl-4 { + padding-right: 1.5rem !important; +} +.pe-xxl-5 { + padding-right: 3rem !important; +} +.pb-xxl-0 { + padding-bottom: 0 !important; +} +.pb-xxl-1 { + padding-bottom: 0.25rem !important; +} +.pb-xxl-2 { + padding-bottom: 0.5rem !important; +} +.pb-xxl-3 { + padding-bottom: 1rem !important; +} +.pb-xxl-4 { + padding-bottom: 1.5rem !important; +} +.pb-xxl-5 { + padding-bottom: 3rem !important; +} +.ps-xxl-0 { + padding-left: 0 !important; +} +.ps-xxl-1 { + padding-left: 0.25rem !important; +} +.ps-xxl-2 { + padding-left: 0.5rem !important; +} +.ps-xxl-3 { + padding-left: 1rem !important; +} +.ps-xxl-4 { + padding-left: 1.5rem !important; +} +.ps-xxl-5 { + padding-left: 3rem !important; +} +.gap-xxl-0 { + gap: 0 !important; +} +.gap-xxl-1 { + gap: 0.25rem !important; +} +.gap-xxl-2 { + gap: 0.5rem !important; +} +.gap-xxl-3 { + gap: 1rem !important; +} +.gap-xxl-4 { + gap: 1.5rem !important; +} +.gap-xxl-5 { + gap: 3rem !important; +} +.row-gap-xxl-0 { + row-gap: 0 !important; +} +.row-gap-xxl-1 { + row-gap: 0.25rem !important; +} +.row-gap-xxl-2 { + row-gap: 0.5rem !important; +} +.row-gap-xxl-3 { + row-gap: 1rem !important; +} +.row-gap-xxl-4 { + row-gap: 1.5rem !important; +} +.row-gap-xxl-5 { + row-gap: 3rem !important; +} +.column-gap-xxl-0 { + column-gap: 0 !important; +} +.column-gap-xxl-1 { + column-gap: 0.25rem !important; +} +.column-gap-xxl-2 { + column-gap: 0.5rem !important; +} +.column-gap-xxl-3 { + column-gap: 1rem !important; +} +.column-gap-xxl-4 { + column-gap: 1.5rem !important; +} +.column-gap-xxl-5 { + column-gap: 3rem !important; +} +.text-xxl-start { + text-align: left !important; +} +.text-xxl-end { + text-align: right !important; +} +.text-xxl-center { + text-align: center !important; +} +} +@media (min-width: 1200px) { +.fs-1 { + font-size: 2.5rem !important; +} +.fs-2 { + font-size: 2rem !important; +} +.fs-3 { + font-size: 1.75rem !important; +} +.fs-4 { + font-size: 1.5rem !important; +} +} +@media print { +.d-print-inline { + display: inline !important; +} +.d-print-inline-block { + display: inline-block !important; +} +.d-print-block { + display: block !important; +} +.d-print-grid { + display: grid !important; +} +.d-print-inline-grid { + display: inline-grid !important; +} +.d-print-table { + display: table !important; +} +.d-print-table-row { + display: table-row !important; +} +.d-print-table-cell { + display: table-cell !important; +} +.d-print-flex { + display: flex !important; +} +.d-print-inline-flex { + display: inline-flex !important; +} +.d-print-none { + display: none !important; +} +} +:root { + --topcon-red: #d9534f; +} +.fileApp { + display: flex; + flex-direction: column; + height: 100%; + transition: left 0.2s ease-in-out, width 0.2s ease-in-out; + width: 100%; + color: #000; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.1607843137); +} +.fileApp ::-webkit-scrollbar { + width: 4px; +} +.fileApp ::-webkit-scrollbar-thumb { + background-color: #495057; +} +.fileApp #fileContainer { + border: 1px solid #dee2e6; + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + align-items: stretch; +} +.fileApp #fileContainer #navigationApp { + flex-shrink: 0; +} +.fileApp #fileContainer #fileContainerMain { + display: flex; + flex-direction: column; + flex-grow: 1; +} +.fileApp #fileContainer #fileContainerMain .file-container-middle { + flex-grow: 1; + flex-shrink: 0; +} +.fileApp #fileContainer #fileContainerMain .file-container-middle .p-message .p-message-text { + margin-left: unset !important; +} +.fileApp #fileContainer #fileContainerMain .file-container-footer { + border-top: 1px solid #dee2e6; +} +@media only screen and (min-width: 923px) { +.fileApp #fileContainer { + flex-direction: row; + height: calc(100vh - 64px); +} +.fileApp #fileContainer #fileContainerMain { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.fileApp #fileContainer #fileContainerMain .file-container-middle { + flex-shrink: 1; + overflow: auto; + scrollbar-width: thin; + scrollbar-color: #495057 #eaeaea; +} +.fileApp #navigationApp { + min-width: 240px; + border-right: 1px solid #dee2e6; + overflow: auto; + scrollbar-width: thin; + scrollbar-color: #495057 #eaeaea; +} +} +.fileApp .alert-info { + font-size: 0.875rem; +} +.fileApp .message-warning { + width: 100%; + display: flex; + padding: 20px; + margin-bottom: 15px; +} +.fileApp .message-warning ul { + list-style: none; + margin: 0; + padding: 0; +} +.fileApp a.disabled { + cursor: default; +} +.left-sidebar-compact #fileApp { + left: 48px; +} +.no-breadcrumb-divider::before { + content: none !important; +} +.breadcrumb-item + .breadcrumb-item { + padding-left: 2px; +} +.breadcrumb-item + .breadcrumb-item:before { + padding-right: 2px; +} +.upload { + background-color: rgba(0, 0, 0, 0.05); + border-radius: 2px; + border: 1px solid #b9dcff; + font-size: 0.875rem; + user-select: none; + min-width: 300px; + flex-grow: 1; +} +.upload .close-warning { + display: block; + float: right; + margin-right: -8px; + cursor: pointer; + padding: 2px 8px; +} +.upload .progress-bar { + display: block; + margin-top: 15px; + height: 3px; + background-color: #007bff; +} +.upload-warning { + color: #856404; + background-color: #fff3cd; + border-color: #856404; +} +.upload-list { + margin-bottom: 8px; +} +.upload-list .header { + display: flex; + justify-content: space-between; + align-items: center; + height: 40px; + padding: 10px; + background-color: rgba(0, 0, 0, 0.03); + border: solid 1px #b9dcff; + cursor: pointer; + font-size: 0.875rem; + color: #666; +} +.upload-list .toggle-button { + padding: 5px; +} +.upload-list .card-body { + border: solid 1px #b9dcff; + border-top: none; + padding: 0; +} +.upload-list .card-body .d-grid { + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + gap: 10px; +} +ol.file-items-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + align-items: stretch; + gap: 15px; + list-style: none; + padding-left: 0; +} +ol.file-items-grid.row { + margin-left: 0; + margin-right: 0; +} +ol.file-items-grid li { + cursor: pointer; + margin-left: 0; + border-radius: 0; +} +ol.file-items-grid li .inline-file-button { + color: #495057; + margin-left: 5px; +} +ol.file-items-grid li .card-footer { + display: flex; + justify-content: center; +} +ol.file-items-grid li.selected { + border: 1px solid red; +} +ol.file-items-grid li.selected .inline-file-button, ol.file-items-grid li:hover .inline-file-button { + opacity: 1; + margin-top: 0px; + transition: all 0.2s; +} +ol.file-items-grid .thumb-container { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + background: white; +} +ol.file-items-grid .thumb-container img { + width: 100%; + background: repeating-conic-gradient(#e9ecef 0% 25%, transparent 0% 50%) 50%/10px 10px; +} +.file-items-table { + font-size: 0.875rem; + display: table; + border-collapse: collapse; + width: 100%; +} +.file-items-table .btn:focus-visible { + box-shadow: unset !important; +} +.file-items-table .form-check { + padding-left: 2.3em; + zoom: 1.5; + margin: unset; +} +.file-items-table .dot { + height: 10px; + width: 10px; + border-radius: 50%; + display: inline-block; + color: #626262; + background: #e6e4e4; + border: 1px solid #a1a1a1; +} +.file-items-table .dot.processed { + color: #0aaa5a; + background: #b9e6cd; + border: 1px solid #5ac878; +} +.file-items-table .table-head { + display: table-header-group; +} +.file-items-table .table-head .table-row { + border-bottom: 1px solid #dee2e6; + font-weight: bold; +} +.file-items-table .table-row { + display: table-row; +} +.file-items-table .table-cell { + display: table-cell; + vertical-align: middle; +} +.file-items-table .table-body { + display: table-row-group; +} +.file-items-table .header-row .table-cell { + border-top: none !important; + padding-top: 8px; + padding-bottom: 8px; + color: #000; + user-select: none; + cursor: pointer; +} +.file-items-table .file-item { + height: 75px; + border-left: solid 2px transparent; + border-top: 1px solid #dee2e6; +} +.file-items-table .file-item.selected { + border-left: solid 2px #0d6efd; +} +.file-items-table .file-item:hover { + background-color: #f1f6ff; +} +.file-items-table .thumbnail-column { + text-align: center; + width: 45px; + margin-right: 5px; +} +.file-items-table .thumbnail-column .img-wrapper svg, +.file-items-table .thumbnail-column .img-wrapper img { + width: 45px; + height: 45px; + opacity: 0.8; +} +.file-items-table .file-name-cell { + display: flex; + flex-direction: column; +} +.file-items-table .file-name-cell .file-filename { + flex-grow: 1; +} +.file-items-table .btn-link { + color: #6c757d; + padding-left: 0; +} +.file-items-table .sort-indicator { + display: inline-block; +} +.file-items-table .file-ext { + color: #fff; + height: 1px; + font-size: 0.7rem; + display: block; + position: relative; + top: -20px; + left: 1px; + font-weight: bold; +} +#file-pager { + display: flex; + justify-content: center; +} +#file-pager .pagination { + display: flex; + padding-left: 0; + list-style: none; + margin: 0px; +} +#file-pager .page-number { + min-width: 34px; + text-align: center; +} +#file-pager .page-size-info, #file-pager .page-info, #file-pager .total-info { + white-space: nowrap; + user-select: none; +} +#file-pager .page-size-info span:hover, #file-pager .page-info span:hover, #file-pager .total-info span:hover { + background-color: inherit; +} +#file-pager .page-link { + outline: none !important; +} +#file-pager .page-link:focus { + outline: none !important; + box-shadow: none !important; +} +@media only screen and (max-width: 576px) { +#file-pager .file-last-button, #file-pager .file-first-button, #file-pager .total-info, #file-pager .page-size-label { + display: none; +} +} +@media only screen and (max-width: 1200px) { +#file-pager .page-number { + display: none; +} +} +.vfm--fixed { + position: fixed; +} +.vfm--absolute { + position: absolute; +} +.vfm--inset { + top: 0; + right: 0; + bottom: 0; + left: 0; +} +.vfm--overlay { + z-index: -1; + background-color: rgba(0, 0, 0, 0.5019607843); +} +.vfm--prevent-none { + pointer-events: none; +} +.vfm--prevent-auto { + pointer-events: auto; +} +.vfm--outline-none:focus { + outline: none; +} +@keyframes fade-in { +0% { + opacity: 0; +} +to { + opacity: 1; +} +} +@keyframes fade-out { +0% { + opacity: 1; +} +to { + opacity: 0; +} +} +.vfm-fade-enter-active { + animation: fade-in 0.3s ease; +} +.vfm-fade-leave-active { + animation: fade-out 0.3s ease; +} +.vfm-bounce-back { + transition-property: transform; + transition-duration: 0.3s; +} +.vfm-slide-up-enter-active, +.vfm-slide-up-leave-active, +.vfm-slide-down-enter-active, +.vfm-slide-down-leave-active { + transition: transform 0.3s ease; +} +.vfm-slide-down-enter-from, +.vfm-slide-down-leave-to { + transform: translateY(100vh) !important; +} +.vfm-slide-up-enter-from, +.vfm-slide-up-leave-to { + transform: translateY(-100vh) !important; +} +.vfm-slide-right-enter-active, +.vfm-slide-right-leave-active, +.vfm-slide-left-enter-active, +.vfm-slide-left-leave-active { + transition: transform 0.3s ease; +} +.vfm-slide-right-enter-from, +.vfm-slide-right-leave-to { + transform: translate(100vw) !important; +} +.vfm-slide-left-enter-from, +.vfm-slide-left-leave-to { + transform: translate(-100vw) !important; +} +.vfm-swipe-banner-back, +.vfm-swipe-banner-forward { + position: fixed; + top: 0; + bottom: 0; + width: 27px; + z-index: 10; +} +.vfm-swipe-banner-back { + left: 0; +} +.vfm-swipe-banner-forward { + right: 0; +} +.vfm { + display: flex; + justify-content: center; + align-items: center; +} +.vfm .vfm__content { + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + width: 50vw; +} +.vfm .vfm__content.bg-white { + background: #fff !important; + color: #000; +} +.vfm .modal__title { + margin: 0 2rem 0.5rem 0; + font-size: 1.5rem; + font-weight: 700; +} +@media only screen and (max-width: 992px) { +.action-modal { + width: 95vw !important; +} +} +.action-bar { + border-bottom: 1px solid #dee2e6; + align-items: center; + /* Upload button */ +} +.action-bar .badge { + color: black; +} +.action-bar .btn-light { + background-color: #f1f6ff; +} +.action-bar .file-filter button { + border-color: #6c757d; +} +.action-bar .file-filter button:disabled { + border-color: #CED4DA !important; + opacity: 1; +} +.action-bar .file-filter svg { + opacity: 0.6; +} +.action-bar .file-filter .fa-filter { + position: relative; + left: 23px; + top: 10px; + z-index: 100; + margin-left: -20px; +} +.action-bar .file-filter .input-filter { + border-color: #ced4da; + border-right: none; + padding-left: 32px; +} +.action-bar .file-filter .input-group-append button { + border-color: #ced4da; + opacity: 1; + border-left: none; +} +.action-bar .file-filter .input-group-append button[disabled] { + color: transparent; +} +.action-bar .file-filter .icon-inside-input { + position: absolute; + top: 8px; + left: 10px; + z-index: 1030; + pointer-events: none; + color: #6c757d; +} +.action-bar .fileinput-button { + cursor: pointer; +} +.action-bar .fileinput-button svg { + margin-right: 6px; +} +.action-bar .fileinput-button input { + width: 0.1px; + height: 0.1px; + opacity: 0; + overflow: hidden; + position: absolute; + z-index: -1; +} +.action-bar input[type=text] { + outline: none; + box-shadow: none !important; +} +#breadcrumb { + background-color: #f1f6ff; + border-bottom: 1px solid #dee2e6; + border-radius: 0px; + min-height: 40px; +} +#breadcrumb .breadcrumb-path { + flex-grow: 1; +} +#breadcrumb .breadcrumb-path .breadcrumb-item { + display: inline-block; +} +#breadcrumb .breadcrumb-path .breadcrumb-item a { + color: #495057; +} +#breadcrumb .breadcrumb-buttons { + justify-content: flex-start; + flex-grow: 1; + margin-top: -5px; +} +#breadcrumb .breadcrumb-buttons a { + border-radius: 0px !important; + color: #495057; +} +.visibility-buttons { + justify-content: flex-end; + flex-grow: 0; +} +.visibility-buttons button { + border-radius: 0px !important; + color: #495057; +} +.visibility-buttons .selected { + color: #0d6efd; +} +#clear-file-filter-button { + z-index: 100; +} +#folder-tree { + list-style: none; + padding-left: 0; + overflow: hidden; +} +#folder-tree .treeroot { + font-weight: 600; + height: 40px; + border-bottom: 1px solid #dee2e6; +} +#folder-tree .treeroot a { + font-size: 1rem; +} +#folder-tree .treeroot a .folder-actions .btn.btn-sm, #folder-tree .treeroot a .folder-actions .btn-group-sm > .btn { + font-size: 0.875rem; +} +#folder-tree .treeroot .expand { + font-size: 0.875rem; + padding: 0; +} +#folder-tree .treeroot + ol { + overflow-x: auto; +} +#folder-tree li.selected > div:not(.treeroot), #folder-tree li.selected > .treeroot { + font-weight: bold; + background-color: #f1f6ff; + border-left: 2px solid var(--topcon-red); +} +#folder-tree .folderhovered { + background-color: #f1f6ff; +} +#folder-tree li div { + min-height: 40px; + padding: 0; +} +#folder-tree li div a { + display: block; +} +#folder-tree div a { + text-decoration: none; +} +#folder-tree ol { + padding-left: 0; +} +#folder-tree .folder { + color: lightgray; +} +#folder-tree li { + list-style: none; +} +#folder-tree .expand { + /* make both icons be in the center as their widths are different */ + text-align: center; + width: 16px; + cursor: pointer; + font-size: 0.625rem; + display: inline-block; + padding: 12px 12px 12px 6px; +} +#folder-tree .empty { + transform: none; + visibility: hidden; +} +#folder-tree .folder-menu-item { + display: flex; + align-items: center; +} +#folder-tree .folder-menu-item .folder-name { + flex-grow: 1; + display: flex; + align-items: center; +} +#folder-tree .folder-menu-item .folder-actions { + align-self: stretch; + display: flex; + align-items: center; + font-size: 0.875rem; + margin-right: 10px; +} +#folder-tree .folder-menu-item .folder-actions a.btn { + display: flex; + align-items: center; +} + +/* rtl:ignore */ +#folder-tree .opened svg { + transform: rotate(90deg); + -webkit-transform: rotate(90deg); +} +#customdropzone { + align-items: center; + background: rgba(95, 175, 139, 0.8); + color: #FFFFFF; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + flex-direction: column; + height: 0px; + justify-content: center; + left: 0; + top: 0; + opacity: 0; + overflow: hidden; + position: fixed; + width: 100%; + z-index: 50; + -webkit-transition: opacity 0.3s ease-out; + -moz-transition: opacity 0.3s ease-out; + -ms-transition: opacity 0.3s ease-out; + -o-transition: opacity 0.3s ease-out; + transition: opacity 0.3s ease-out; +} +#customdropzone.in { + opacity: 1; + height: 100%; + -webkit-transition: opacity 0.3s ease-out; + -moz-transition: opacity 0.3s ease-out; + -ms-transition: opacity 0.3s ease-out; + -o-transition: opacity 0.3s ease-out; + transition: opacity 0.3s ease-out; +} +.file-modal.modal-dialog, +.file-modal .modal-content { + height: 95%; +} +.modal-content .modal-body #fileApp { + position: static; + height: 100%; +} +.file-modal .modal-body { + height: 100%; + overflow-y: auto; + padding: 0; +} +.file-modal .modal-body #fileContainer #navigationApp { + border-right: none !important; +} +.file-modal .modal-body #fileContainer #fileContainerMain { + border-left: 1px solid #dee2e6; + margin-left: 0 !important; +} +.file-modal .modal-body #fileContainer #folder-tree a, +.file-modal .modal-body #fileContainer .breadcrumb-item a { + font-size: 0.9rem; +} +@media only screen and (min-width: 576px) { +.modal-dialog.file-modal { + max-width: 992px; + padding-left: 17px; +} +} +#createFolderModal, #renameFileModal { + z-index: 100000; +} +.modal-body #file-pager .page-number, .modal-body #file-pager .file-first-button, .modal-body #file-pager .file-last-button { + display: none; +} +.file-container-main-item-title { + border-top: solid 1px #dee2e6; + overflow: hidden; +} +.file-container-main-item-title .file-filename { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block; +} +.break-word { + word-break: break-all; + word-wrap: break-word; +} +[v-cloak] { + display: none !important; +} +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid #b9dcff; + border-radius: 0.25rem; + margin-bottom: unset !important; +} +.card-body { + flex: 1 1 auto; + padding: 1rem 1rem; +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} +.card-footer { + padding: 0.5rem 1rem; + background-color: #e1f0ff; + border-top: 1px solid #dee2e6; +} +.flex { + display: flex; +} +.cursor-pointer { + cursor: pointer; +} +.uppercase { + text-transform: uppercase; +} \ No newline at end of file diff --git a/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/assets/index.js b/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/assets/index.js new file mode 100644 index 00000000000..d8451f2c8dd --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.Media/Assets/js/vue/media-app/dist/assets/index.js @@ -0,0 +1,39775 @@ +var __defProp = Object.defineProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +(function polyfill() { + const relList = document.createElement("link").relList; + if (relList && relList.supports && relList.supports("modulepreload")) { + return; + } + for (const link of document.querySelectorAll('link[rel="modulepreload"]')) { + processPreload(link); + } + new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.type !== "childList") { + continue; + } + for (const node of mutation.addedNodes) { + if (node.tagName === "LINK" && node.rel === "modulepreload") + processPreload(node); + } + } + }).observe(document, { childList: true, subtree: true }); + function getFetchOpts(link) { + const fetchOpts = {}; + if (link.integrity) + fetchOpts.integrity = link.integrity; + if (link.referrerPolicy) + fetchOpts.referrerPolicy = link.referrerPolicy; + if (link.crossOrigin === "use-credentials") + fetchOpts.credentials = "include"; + else if (link.crossOrigin === "anonymous") + fetchOpts.credentials = "omit"; + else + fetchOpts.credentials = "same-origin"; + return fetchOpts; + } + function processPreload(link) { + if (link.ep) + return; + link.ep = true; + const fetchOpts = getFetchOpts(link); + fetch(link.href, fetchOpts); + } +})(); +/** +* @vue/shared v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +function makeMap(str, expectsLowerCase) { + const set3 = new Set(str.split(",")); + return expectsLowerCase ? (val) => set3.has(val.toLowerCase()) : (val) => set3.has(val); +} +const EMPTY_OBJ = {}; +const EMPTY_ARR = []; +const NOOP = () => { +}; +const NO = () => false; +const isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter +(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97); +const isModelListener = (key) => key.startsWith("onUpdate:"); +const extend$1 = Object.assign; +const remove = (arr, el) => { + const i = arr.indexOf(el); + if (i > -1) { + arr.splice(i, 1); + } +}; +const hasOwnProperty$3 = Object.prototype.hasOwnProperty; +const hasOwn = (val, key) => hasOwnProperty$3.call(val, key); +const isArray$1 = Array.isArray; +const isMap = (val) => toTypeString(val) === "[object Map]"; +const isSet = (val) => toTypeString(val) === "[object Set]"; +const isDate$1 = (val) => toTypeString(val) === "[object Date]"; +const isRegExp$1 = (val) => toTypeString(val) === "[object RegExp]"; +const isFunction$1 = (val) => typeof val === "function"; +const isString$1 = (val) => typeof val === "string"; +const isSymbol$2 = (val) => typeof val === "symbol"; +const isObject$6 = (val) => val !== null && typeof val === "object"; +const isPromise = (val) => { + return (isObject$6(val) || isFunction$1(val)) && isFunction$1(val.then) && isFunction$1(val.catch); +}; +const objectToString$2 = Object.prototype.toString; +const toTypeString = (value) => objectToString$2.call(value); +const toRawType = (value) => { + return toTypeString(value).slice(8, -1); +}; +const isPlainObject$1 = (val) => toTypeString(val) === "[object Object]"; +const isIntegerKey = (key) => isString$1(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; +const isReservedProp = /* @__PURE__ */ makeMap( + // the leading comma is intentional so empty string "" is also included + ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" +); +const isBuiltInDirective = /* @__PURE__ */ makeMap( + "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo" +); +const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null); + return (str) => { + const hit = cache[str]; + return hit || (cache[str] = fn(str)); + }; +}; +const camelizeRE = /-(\w)/g; +const camelize = cacheStringFunction((str) => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); +}); +const hyphenateRE = /\B([A-Z])/g; +const hyphenate = cacheStringFunction( + (str) => str.replace(hyphenateRE, "-$1").toLowerCase() +); +const capitalize = cacheStringFunction((str) => { + return str.charAt(0).toUpperCase() + str.slice(1); +}); +const toHandlerKey = cacheStringFunction((str) => { + const s = str ? `on${capitalize(str)}` : ``; + return s; +}); +const hasChanged = (value, oldValue) => !Object.is(value, oldValue); +const invokeArrayFns = (fns, arg) => { + for (let i = 0; i < fns.length; i++) { + fns[i](arg); + } +}; +const def = (obj, key, value) => { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: false, + value + }); +}; +const looseToNumber = (val) => { + const n = parseFloat(val); + return isNaN(n) ? val : n; +}; +const toNumber$2 = (val) => { + const n = isString$1(val) ? Number(val) : NaN; + return isNaN(n) ? val : n; +}; +let _globalThis; +const getGlobalThis = () => { + return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); +}; +const GLOBALS_ALLOWED = "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"; +const isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED); +function normalizeStyle(value) { + if (isArray$1(value)) { + const res = {}; + for (let i = 0; i < value.length; i++) { + const item = value[i]; + const normalized = isString$1(item) ? parseStringStyle(item) : normalizeStyle(item); + if (normalized) { + for (const key in normalized) { + res[key] = normalized[key]; + } + } + } + return res; + } else if (isString$1(value) || isObject$6(value)) { + return value; + } +} +const listDelimiterRE = /;(?![^(]*\))/g; +const propertyDelimiterRE = /:([^]+)/; +const styleCommentRE = /\/\*[^]*?\*\//g; +function parseStringStyle(cssText) { + const ret = {}; + cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { + if (item) { + const tmp = item.split(propertyDelimiterRE); + tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); + } + }); + return ret; +} +function normalizeClass(value) { + let res = ""; + if (isString$1(value)) { + res = value; + } else if (isArray$1(value)) { + for (let i = 0; i < value.length; i++) { + const normalized = normalizeClass(value[i]); + if (normalized) { + res += normalized + " "; + } + } + } else if (isObject$6(value)) { + for (const name in value) { + if (value[name]) { + res += name + " "; + } + } + } + return res.trim(); +} +function normalizeProps(props) { + if (!props) + return null; + let { class: klass, style } = props; + if (klass && !isString$1(klass)) { + props.class = normalizeClass(klass); + } + if (style) { + props.style = normalizeStyle(style); + } + return props; +} +const HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"; +const SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"; +const MATH_TAGS = "annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics"; +const VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"; +const isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS); +const isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS); +const isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS); +const isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS); +const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; +const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs); +function includeBooleanAttr(value) { + return !!value || value === ""; +} +function looseCompareArrays(a, b) { + if (a.length !== b.length) + return false; + let equal = true; + for (let i = 0; equal && i < a.length; i++) { + equal = looseEqual(a[i], b[i]); + } + return equal; +} +function looseEqual(a, b) { + if (a === b) + return true; + let aValidType = isDate$1(a); + let bValidType = isDate$1(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? a.getTime() === b.getTime() : false; + } + aValidType = isSymbol$2(a); + bValidType = isSymbol$2(b); + if (aValidType || bValidType) { + return a === b; + } + aValidType = isArray$1(a); + bValidType = isArray$1(b); + if (aValidType || bValidType) { + return aValidType && bValidType ? looseCompareArrays(a, b) : false; + } + aValidType = isObject$6(a); + bValidType = isObject$6(b); + if (aValidType || bValidType) { + if (!aValidType || !bValidType) { + return false; + } + const aKeysCount = Object.keys(a).length; + const bKeysCount = Object.keys(b).length; + if (aKeysCount !== bKeysCount) { + return false; + } + for (const key in a) { + const aHasKey = a.hasOwnProperty(key); + const bHasKey = b.hasOwnProperty(key); + if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { + return false; + } + } + } + return String(a) === String(b); +} +function looseIndexOf(arr, val) { + return arr.findIndex((item) => looseEqual(item, val)); +} +const toDisplayString = (val) => { + return isString$1(val) ? val : val == null ? "" : isArray$1(val) || isObject$6(val) && (val.toString === objectToString$2 || !isFunction$1(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val); +}; +const replacer = (_key, val) => { + if (val && val.__v_isRef) { + return replacer(_key, val.value); + } else if (isMap(val)) { + return { + [`Map(${val.size})`]: [...val.entries()].reduce( + (entries, [key, val2], i) => { + entries[stringifySymbol(key, i) + " =>"] = val2; + return entries; + }, + {} + ) + }; + } else if (isSet(val)) { + return { + [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) + }; + } else if (isSymbol$2(val)) { + return stringifySymbol(val); + } else if (isObject$6(val) && !isArray$1(val) && !isPlainObject$1(val)) { + return String(val); + } + return val; +}; +const stringifySymbol = (v, i = "") => { + var _a; + return isSymbol$2(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v; +}; +/** +* @vue/reactivity v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +let activeEffectScope; +class EffectScope { + constructor(detached = false) { + this.detached = detached; + this._active = true; + this.effects = []; + this.cleanups = []; + this.parent = activeEffectScope; + if (!detached && activeEffectScope) { + this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( + this + ) - 1; + } + } + get active() { + return this._active; + } + run(fn) { + if (this._active) { + const currentEffectScope = activeEffectScope; + try { + activeEffectScope = this; + return fn(); + } finally { + activeEffectScope = currentEffectScope; + } + } + } + /** + * This should only be called on non-detached scopes + * @internal + */ + on() { + activeEffectScope = this; + } + /** + * This should only be called on non-detached scopes + * @internal + */ + off() { + activeEffectScope = this.parent; + } + stop(fromParent) { + if (this._active) { + let i, l; + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].stop(); + } + for (i = 0, l = this.cleanups.length; i < l; i++) { + this.cleanups[i](); + } + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].stop(true); + } + } + if (!this.detached && this.parent && !fromParent) { + const last = this.parent.scopes.pop(); + if (last && last !== this) { + this.parent.scopes[this.index] = last; + last.index = this.index; + } + } + this.parent = void 0; + this._active = false; + } + } +} +function effectScope(detached) { + return new EffectScope(detached); +} +function recordEffectScope(effect2, scope = activeEffectScope) { + if (scope && scope.active) { + scope.effects.push(effect2); + } +} +function getCurrentScope() { + return activeEffectScope; +} +function onScopeDispose(fn) { + if (activeEffectScope) { + activeEffectScope.cleanups.push(fn); + } +} +let activeEffect; +class ReactiveEffect { + constructor(fn, trigger2, scheduler, scope) { + this.fn = fn; + this.trigger = trigger2; + this.scheduler = scheduler; + this.active = true; + this.deps = []; + this._dirtyLevel = 4; + this._trackId = 0; + this._runnings = 0; + this._shouldSchedule = false; + this._depsLength = 0; + recordEffectScope(this, scope); + } + get dirty() { + if (this._dirtyLevel === 2 || this._dirtyLevel === 3) { + this._dirtyLevel = 1; + pauseTracking(); + for (let i = 0; i < this._depsLength; i++) { + const dep = this.deps[i]; + if (dep.computed) { + triggerComputed(dep.computed); + if (this._dirtyLevel >= 4) { + break; + } + } + } + if (this._dirtyLevel === 1) { + this._dirtyLevel = 0; + } + resetTracking(); + } + return this._dirtyLevel >= 4; + } + set dirty(v) { + this._dirtyLevel = v ? 4 : 0; + } + run() { + this._dirtyLevel = 0; + if (!this.active) { + return this.fn(); + } + let lastShouldTrack = shouldTrack; + let lastEffect = activeEffect; + try { + shouldTrack = true; + activeEffect = this; + this._runnings++; + preCleanupEffect(this); + return this.fn(); + } finally { + postCleanupEffect(this); + this._runnings--; + activeEffect = lastEffect; + shouldTrack = lastShouldTrack; + } + } + stop() { + var _a; + if (this.active) { + preCleanupEffect(this); + postCleanupEffect(this); + (_a = this.onStop) == null ? void 0 : _a.call(this); + this.active = false; + } + } +} +function triggerComputed(computed2) { + return computed2.value; +} +function preCleanupEffect(effect2) { + effect2._trackId++; + effect2._depsLength = 0; +} +function postCleanupEffect(effect2) { + if (effect2.deps.length > effect2._depsLength) { + for (let i = effect2._depsLength; i < effect2.deps.length; i++) { + cleanupDepEffect(effect2.deps[i], effect2); + } + effect2.deps.length = effect2._depsLength; + } +} +function cleanupDepEffect(dep, effect2) { + const trackId = dep.get(effect2); + if (trackId !== void 0 && effect2._trackId !== trackId) { + dep.delete(effect2); + if (dep.size === 0) { + dep.cleanup(); + } + } +} +function effect(fn, options) { + if (fn.effect instanceof ReactiveEffect) { + fn = fn.effect.fn; + } + const _effect = new ReactiveEffect(fn, NOOP, () => { + if (_effect.dirty) { + _effect.run(); + } + }); + if (options) { + extend$1(_effect, options); + if (options.scope) + recordEffectScope(_effect, options.scope); + } + if (!options || !options.lazy) { + _effect.run(); + } + const runner = _effect.run.bind(_effect); + runner.effect = _effect; + return runner; +} +function stop(runner) { + runner.effect.stop(); +} +let shouldTrack = true; +let pauseScheduleStack = 0; +const trackStack = []; +function pauseTracking() { + trackStack.push(shouldTrack); + shouldTrack = false; +} +function resetTracking() { + const last = trackStack.pop(); + shouldTrack = last === void 0 ? true : last; +} +function pauseScheduling() { + pauseScheduleStack++; +} +function resetScheduling() { + pauseScheduleStack--; + while (!pauseScheduleStack && queueEffectSchedulers.length) { + queueEffectSchedulers.shift()(); + } +} +function trackEffect(effect2, dep, debuggerEventExtraInfo) { + if (dep.get(effect2) !== effect2._trackId) { + dep.set(effect2, effect2._trackId); + const oldDep = effect2.deps[effect2._depsLength]; + if (oldDep !== dep) { + if (oldDep) { + cleanupDepEffect(oldDep, effect2); + } + effect2.deps[effect2._depsLength++] = dep; + } else { + effect2._depsLength++; + } + } +} +const queueEffectSchedulers = []; +function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) { + pauseScheduling(); + for (const effect2 of dep.keys()) { + let tracking; + if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { + effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0); + effect2._dirtyLevel = dirtyLevel; + } + if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { + effect2.trigger(); + if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) { + effect2._shouldSchedule = false; + if (effect2.scheduler) { + queueEffectSchedulers.push(effect2.scheduler); + } + } + } + } + resetScheduling(); +} +const createDep = (cleanup, computed2) => { + const dep = /* @__PURE__ */ new Map(); + dep.cleanup = cleanup; + dep.computed = computed2; + return dep; +}; +const targetMap = /* @__PURE__ */ new WeakMap(); +const ITERATE_KEY = Symbol(""); +const MAP_KEY_ITERATE_KEY = Symbol(""); +function track(target, type, key) { + if (shouldTrack && activeEffect) { + let depsMap = targetMap.get(target); + if (!depsMap) { + targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); + } + let dep = depsMap.get(key); + if (!dep) { + depsMap.set(key, dep = createDep(() => depsMap.delete(key))); + } + trackEffect( + activeEffect, + dep + ); + } +} +function trigger(target, type, key, newValue, oldValue, oldTarget) { + const depsMap = targetMap.get(target); + if (!depsMap) { + return; + } + let deps = []; + if (type === "clear") { + deps = [...depsMap.values()]; + } else if (key === "length" && isArray$1(target)) { + const newLength = Number(newValue); + depsMap.forEach((dep, key2) => { + if (key2 === "length" || !isSymbol$2(key2) && key2 >= newLength) { + deps.push(dep); + } + }); + } else { + if (key !== void 0) { + deps.push(depsMap.get(key)); + } + switch (type) { + case "add": + if (!isArray$1(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } else if (isIntegerKey(key)) { + deps.push(depsMap.get("length")); + } + break; + case "delete": + if (!isArray$1(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } + break; + case "set": + if (isMap(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + } + break; + } + } + pauseScheduling(); + for (const dep of deps) { + if (dep) { + triggerEffects( + dep, + 4 + ); + } + } + resetScheduling(); +} +function getDepFromReactive(object, key) { + var _a; + return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key); +} +const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`); +const builtInSymbols = new Set( + /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol$2) +); +const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations(); +function createArrayInstrumentations() { + const instrumentations = {}; + ["includes", "indexOf", "lastIndexOf"].forEach((key) => { + instrumentations[key] = function(...args) { + const arr = toRaw(this); + for (let i = 0, l = this.length; i < l; i++) { + track(arr, "get", i + ""); + } + const res = arr[key](...args); + if (res === -1 || res === false) { + return arr[key](...args.map(toRaw)); + } else { + return res; + } + }; + }); + ["push", "pop", "shift", "unshift", "splice"].forEach((key) => { + instrumentations[key] = function(...args) { + pauseTracking(); + pauseScheduling(); + const res = toRaw(this)[key].apply(this, args); + resetScheduling(); + resetTracking(); + return res; + }; + }); + return instrumentations; +} +function hasOwnProperty$2(key) { + const obj = toRaw(this); + track(obj, "has", key); + return obj.hasOwnProperty(key); +} +class BaseReactiveHandler { + constructor(_isReadonly = false, _isShallow = false) { + this._isReadonly = _isReadonly; + this._isShallow = _isShallow; + } + get(target, key, receiver) { + const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_isShallow") { + return isShallow2; + } else if (key === "__v_raw") { + if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype + // this means the reciever is a user proxy of the reactive proxy + Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { + return target; + } + return; + } + const targetIsArray = isArray$1(target); + if (!isReadonly2) { + if (targetIsArray && hasOwn(arrayInstrumentations, key)) { + return Reflect.get(arrayInstrumentations, key, receiver); + } + if (key === "hasOwnProperty") { + return hasOwnProperty$2; + } + } + const res = Reflect.get(target, key, receiver); + if (isSymbol$2(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { + return res; + } + if (!isReadonly2) { + track(target, "get", key); + } + if (isShallow2) { + return res; + } + if (isRef(res)) { + return targetIsArray && isIntegerKey(key) ? res : res.value; + } + if (isObject$6(res)) { + return isReadonly2 ? readonly(res) : reactive(res); + } + return res; + } +} +class MutableReactiveHandler extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(false, isShallow2); + } + set(target, key, value, receiver) { + let oldValue = target[key]; + if (!this._isShallow) { + const isOldValueReadonly = isReadonly(oldValue); + if (!isShallow(value) && !isReadonly(value)) { + oldValue = toRaw(oldValue); + value = toRaw(value); + } + if (!isArray$1(target) && isRef(oldValue) && !isRef(value)) { + if (isOldValueReadonly) { + return false; + } else { + oldValue.value = value; + return true; + } + } + } + const hadKey = isArray$1(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); + const result = Reflect.set(target, key, value, receiver); + if (target === toRaw(receiver)) { + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value); + } + } + return result; + } + deleteProperty(target, key) { + const hadKey = hasOwn(target, key); + target[key]; + const result = Reflect.deleteProperty(target, key); + if (result && hadKey) { + trigger(target, "delete", key, void 0); + } + return result; + } + has(target, key) { + const result = Reflect.has(target, key); + if (!isSymbol$2(key) || !builtInSymbols.has(key)) { + track(target, "has", key); + } + return result; + } + ownKeys(target) { + track( + target, + "iterate", + isArray$1(target) ? "length" : ITERATE_KEY + ); + return Reflect.ownKeys(target); + } +} +class ReadonlyReactiveHandler extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(true, isShallow2); + } + set(target, key) { + return true; + } + deleteProperty(target, key) { + return true; + } +} +const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler(); +const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(); +const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler( + true +); +const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true); +const toShallow = (value) => value; +const getProto = (v) => Reflect.getPrototypeOf(v); +function get(target, key, isReadonly2 = false, isShallow2 = false) { + target = target["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "get", key); + } + track(rawTarget, "get", rawKey); + } + const { has: has2 } = getProto(rawTarget); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + if (has2.call(rawTarget, key)) { + return wrap(target.get(key)); + } else if (has2.call(rawTarget, rawKey)) { + return wrap(target.get(rawKey)); + } else if (target !== rawTarget) { + target.get(key); + } +} +function has(key, isReadonly2 = false) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "has", key); + } + track(rawTarget, "has", rawKey); + } + return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); +} +function size(target, isReadonly2 = false) { + target = target["__v_raw"]; + !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY); + return Reflect.get(target, "size", target); +} +function add(value) { + value = toRaw(value); + const target = toRaw(this); + const proto = getProto(target); + const hadKey = proto.has.call(target, value); + if (!hadKey) { + target.add(value); + trigger(target, "add", value, value); + } + return this; +} +function set(key, value) { + value = toRaw(value); + const target = toRaw(this); + const { has: has2, get: get22 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } + const oldValue = get22.call(target, key); + target.set(key, value); + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value); + } + return this; +} +function deleteEntry(key) { + const target = toRaw(this); + const { has: has2, get: get22 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } + get22 ? get22.call(target, key) : void 0; + const result = target.delete(key); + if (hadKey) { + trigger(target, "delete", key, void 0); + } + return result; +} +function clear() { + const target = toRaw(this); + const hadItems = target.size !== 0; + const result = target.clear(); + if (hadItems) { + trigger(target, "clear", void 0, void 0); + } + return result; +} +function createForEach(isReadonly2, isShallow2) { + return function forEach2(callback, thisArg) { + const observed = this; + const target = observed["__v_raw"]; + const rawTarget = toRaw(target); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY); + return target.forEach((value, key) => { + return callback.call(thisArg, wrap(value), wrap(key), observed); + }); + }; +} +function createIterableMethod(method, isReadonly2, isShallow2) { + return function(...args) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const targetIsMap = isMap(rawTarget); + const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; + const isKeyOnly = method === "keys" && targetIsMap; + const innerIterator = target[method](...args); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track( + rawTarget, + "iterate", + isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY + ); + return { + // iterator protocol + next() { + const { value, done } = innerIterator.next(); + return done ? { value, done } : { + value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), + done + }; + }, + // iterable protocol + [Symbol.iterator]() { + return this; + } + }; + }; +} +function createReadonlyMethod(type) { + return function(...args) { + return type === "delete" ? false : type === "clear" ? void 0 : this; + }; +} +function createInstrumentations() { + const mutableInstrumentations2 = { + get(key) { + return get(this, key); + }, + get size() { + return size(this); + }, + has, + add, + set, + delete: deleteEntry, + clear, + forEach: createForEach(false, false) + }; + const shallowInstrumentations2 = { + get(key) { + return get(this, key, false, true); + }, + get size() { + return size(this); + }, + has, + add, + set, + delete: deleteEntry, + clear, + forEach: createForEach(false, true) + }; + const readonlyInstrumentations2 = { + get(key) { + return get(this, key, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has.call(this, key, true); + }, + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear"), + forEach: createForEach(true, false) + }; + const shallowReadonlyInstrumentations2 = { + get(key) { + return get(this, key, true, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has.call(this, key, true); + }, + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear"), + forEach: createForEach(true, true) + }; + const iteratorMethods = ["keys", "values", "entries", Symbol.iterator]; + iteratorMethods.forEach((method) => { + mutableInstrumentations2[method] = createIterableMethod( + method, + false, + false + ); + readonlyInstrumentations2[method] = createIterableMethod( + method, + true, + false + ); + shallowInstrumentations2[method] = createIterableMethod( + method, + false, + true + ); + shallowReadonlyInstrumentations2[method] = createIterableMethod( + method, + true, + true + ); + }); + return [ + mutableInstrumentations2, + readonlyInstrumentations2, + shallowInstrumentations2, + shallowReadonlyInstrumentations2 + ]; +} +const [ + mutableInstrumentations, + readonlyInstrumentations, + shallowInstrumentations, + shallowReadonlyInstrumentations +] = /* @__PURE__ */ createInstrumentations(); +function createInstrumentationGetter(isReadonly2, shallow) { + const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations; + return (target, key, receiver) => { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_raw") { + return target; + } + return Reflect.get( + hasOwn(instrumentations, key) && key in target ? instrumentations : target, + key, + receiver + ); + }; +} +const mutableCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, false) +}; +const shallowCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, true) +}; +const readonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, false) +}; +const shallowReadonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, true) +}; +const reactiveMap = /* @__PURE__ */ new WeakMap(); +const shallowReactiveMap = /* @__PURE__ */ new WeakMap(); +const readonlyMap = /* @__PURE__ */ new WeakMap(); +const shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); +function targetTypeMap(rawType) { + switch (rawType) { + case "Object": + case "Array": + return 1; + case "Map": + case "Set": + case "WeakMap": + case "WeakSet": + return 2; + default: + return 0; + } +} +function getTargetType(value) { + return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); +} +function reactive(target) { + if (isReadonly(target)) { + return target; + } + return createReactiveObject( + target, + false, + mutableHandlers, + mutableCollectionHandlers, + reactiveMap + ); +} +function shallowReactive(target) { + return createReactiveObject( + target, + false, + shallowReactiveHandlers, + shallowCollectionHandlers, + shallowReactiveMap + ); +} +function readonly(target) { + return createReactiveObject( + target, + true, + readonlyHandlers, + readonlyCollectionHandlers, + readonlyMap + ); +} +function shallowReadonly(target) { + return createReactiveObject( + target, + true, + shallowReadonlyHandlers, + shallowReadonlyCollectionHandlers, + shallowReadonlyMap + ); +} +function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { + if (!isObject$6(target)) { + return target; + } + if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { + return target; + } + const existingProxy = proxyMap.get(target); + if (existingProxy) { + return existingProxy; + } + const targetType = getTargetType(target); + if (targetType === 0) { + return target; + } + const proxy = new Proxy( + target, + targetType === 2 ? collectionHandlers : baseHandlers + ); + proxyMap.set(target, proxy); + return proxy; +} +function isReactive(value) { + if (isReadonly(value)) { + return isReactive(value["__v_raw"]); + } + return !!(value && value["__v_isReactive"]); +} +function isReadonly(value) { + return !!(value && value["__v_isReadonly"]); +} +function isShallow(value) { + return !!(value && value["__v_isShallow"]); +} +function isProxy(value) { + return isReactive(value) || isReadonly(value); +} +function toRaw(observed) { + const raw = observed && observed["__v_raw"]; + return raw ? toRaw(raw) : observed; +} +function markRaw(value) { + if (Object.isExtensible(value)) { + def(value, "__v_skip", true); + } + return value; +} +const toReactive = (value) => isObject$6(value) ? reactive(value) : value; +const toReadonly = (value) => isObject$6(value) ? readonly(value) : value; +class ComputedRefImpl { + constructor(getter, _setter, isReadonly2, isSSR) { + this.getter = getter; + this._setter = _setter; + this.dep = void 0; + this.__v_isRef = true; + this["__v_isReadonly"] = false; + this.effect = new ReactiveEffect( + () => getter(this._value), + () => triggerRefValue( + this, + this.effect._dirtyLevel === 2 ? 2 : 3 + ) + ); + this.effect.computed = this; + this.effect.active = this._cacheable = !isSSR; + this["__v_isReadonly"] = isReadonly2; + } + get value() { + const self2 = toRaw(this); + if ((!self2._cacheable || self2.effect.dirty) && hasChanged(self2._value, self2._value = self2.effect.run())) { + triggerRefValue(self2, 4); + } + trackRefValue(self2); + if (self2.effect._dirtyLevel >= 2) { + triggerRefValue(self2, 2); + } + return self2._value; + } + set value(newValue) { + this._setter(newValue); + } + // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x + get _dirty() { + return this.effect.dirty; + } + set _dirty(v) { + this.effect.dirty = v; + } + // #endregion +} +function computed$1(getterOrOptions, debugOptions, isSSR = false) { + let getter; + let setter; + const onlyGetter = isFunction$1(getterOrOptions); + if (onlyGetter) { + getter = getterOrOptions; + setter = NOOP; + } else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR); + return cRef; +} +function trackRefValue(ref2) { + var _a; + if (shouldTrack && activeEffect) { + ref2 = toRaw(ref2); + trackEffect( + activeEffect, + (_a = ref2.dep) != null ? _a : ref2.dep = createDep( + () => ref2.dep = void 0, + ref2 instanceof ComputedRefImpl ? ref2 : void 0 + ) + ); + } +} +function triggerRefValue(ref2, dirtyLevel = 4, newVal) { + ref2 = toRaw(ref2); + const dep = ref2.dep; + if (dep) { + triggerEffects( + dep, + dirtyLevel + ); + } +} +function isRef(r) { + return !!(r && r.__v_isRef === true); +} +function ref(value) { + return createRef(value, false); +} +function shallowRef(value) { + return createRef(value, true); +} +function createRef(rawValue, shallow) { + if (isRef(rawValue)) { + return rawValue; + } + return new RefImpl(rawValue, shallow); +} +class RefImpl { + constructor(value, __v_isShallow) { + this.__v_isShallow = __v_isShallow; + this.dep = void 0; + this.__v_isRef = true; + this._rawValue = __v_isShallow ? value : toRaw(value); + this._value = __v_isShallow ? value : toReactive(value); + } + get value() { + trackRefValue(this); + return this._value; + } + set value(newVal) { + const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal); + newVal = useDirectValue ? newVal : toRaw(newVal); + if (hasChanged(newVal, this._rawValue)) { + this._rawValue = newVal; + this._value = useDirectValue ? newVal : toReactive(newVal); + triggerRefValue(this, 4); + } + } +} +function triggerRef(ref2) { + triggerRefValue(ref2, 4); +} +function unref(ref2) { + return isRef(ref2) ? ref2.value : ref2; +} +function toValue$1(source) { + return isFunction$1(source) ? source() : unref(source); +} +const shallowUnwrapHandlers = { + get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)), + set: (target, key, value, receiver) => { + const oldValue = target[key]; + if (isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + return true; + } else { + return Reflect.set(target, key, value, receiver); + } + } +}; +function proxyRefs(objectWithRefs) { + return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); +} +class CustomRefImpl { + constructor(factory) { + this.dep = void 0; + this.__v_isRef = true; + const { get: get22, set: set22 } = factory( + () => trackRefValue(this), + () => triggerRefValue(this) + ); + this._get = get22; + this._set = set22; + } + get value() { + return this._get(); + } + set value(newVal) { + this._set(newVal); + } +} +function customRef(factory) { + return new CustomRefImpl(factory); +} +function toRefs(object) { + const ret = isArray$1(object) ? new Array(object.length) : {}; + for (const key in object) { + ret[key] = propertyToRef(object, key); + } + return ret; +} +class ObjectRefImpl { + constructor(_object, _key, _defaultValue) { + this._object = _object; + this._key = _key; + this._defaultValue = _defaultValue; + this.__v_isRef = true; + } + get value() { + const val = this._object[this._key]; + return val === void 0 ? this._defaultValue : val; + } + set value(newVal) { + this._object[this._key] = newVal; + } + get dep() { + return getDepFromReactive(toRaw(this._object), this._key); + } +} +class GetterRefImpl { + constructor(_getter) { + this._getter = _getter; + this.__v_isRef = true; + this.__v_isReadonly = true; + } + get value() { + return this._getter(); + } +} +function toRef(source, key, defaultValue) { + if (isRef(source)) { + return source; + } else if (isFunction$1(source)) { + return new GetterRefImpl(source); + } else if (isObject$6(source) && arguments.length > 1) { + return propertyToRef(source, key, defaultValue); + } else { + return ref(source); + } +} +function propertyToRef(source, key, defaultValue) { + const val = source[key]; + return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue); +} +const TrackOpTypes = { + "GET": "get", + "HAS": "has", + "ITERATE": "iterate" +}; +const TriggerOpTypes = { + "SET": "set", + "ADD": "add", + "DELETE": "delete", + "CLEAR": "clear" +}; +/** +* @vue/runtime-core v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +const stack$1 = []; +function warn$1(msg, ...args) { + pauseTracking(); + const instance = stack$1.length ? stack$1[stack$1.length - 1].component : null; + const appWarnHandler = instance && instance.appContext.config.warnHandler; + const trace = getComponentTrace(); + if (appWarnHandler) { + callWithErrorHandling( + appWarnHandler, + instance, + 11, + [ + msg + args.map((a) => { + var _a, _b; + return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a); + }).join(""), + instance && instance.proxy, + trace.map( + ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` + ).join("\n"), + trace + ] + ); + } else { + const warnArgs = [`[Vue warn]: ${msg}`, ...args]; + if (trace.length && // avoid spamming console during tests + true) { + warnArgs.push(` +`, ...formatTrace(trace)); + } + console.warn(...warnArgs); + } + resetTracking(); +} +function getComponentTrace() { + let currentVNode = stack$1[stack$1.length - 1]; + if (!currentVNode) { + return []; + } + const normalizedStack = []; + while (currentVNode) { + const last = normalizedStack[0]; + if (last && last.vnode === currentVNode) { + last.recurseCount++; + } else { + normalizedStack.push({ + vnode: currentVNode, + recurseCount: 0 + }); + } + const parentInstance = currentVNode.component && currentVNode.component.parent; + currentVNode = parentInstance && parentInstance.vnode; + } + return normalizedStack; +} +function formatTrace(trace) { + const logs = []; + trace.forEach((entry, i) => { + logs.push(...i === 0 ? [] : [` +`], ...formatTraceEntry(entry)); + }); + return logs; +} +function formatTraceEntry({ vnode, recurseCount }) { + const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; + const isRoot = vnode.component ? vnode.component.parent == null : false; + const open = ` at <${formatComponentName( + vnode.component, + vnode.type, + isRoot + )}`; + const close = `>` + postfix; + return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; +} +function formatProps(props) { + const res = []; + const keys = Object.keys(props); + keys.slice(0, 3).forEach((key) => { + res.push(...formatProp(key, props[key])); + }); + if (keys.length > 3) { + res.push(` ...`); + } + return res; +} +function formatProp(key, value, raw) { + if (isString$1(value)) { + value = JSON.stringify(value); + return raw ? value : [`${key}=${value}`]; + } else if (typeof value === "number" || typeof value === "boolean" || value == null) { + return raw ? value : [`${key}=${value}`]; + } else if (isRef(value)) { + value = formatProp(key, toRaw(value.value), true); + return raw ? value : [`${key}=Ref<`, value, `>`]; + } else if (isFunction$1(value)) { + return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; + } else { + value = toRaw(value); + return raw ? value : [`${key}=`, value]; + } +} +function assertNumber(val, type) { + return; +} +const ErrorCodes = { + "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" +}; +const ErrorTypeStrings$1 = { + ["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. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core ." +}; +function callWithErrorHandling(fn, instance, type, args) { + try { + return args ? fn(...args) : fn(); + } catch (err) { + handleError(err, instance, type); + } +} +function callWithAsyncErrorHandling(fn, instance, type, args) { + if (isFunction$1(fn)) { + const res = callWithErrorHandling(fn, instance, type, args); + if (res && isPromise(res)) { + res.catch((err) => { + handleError(err, instance, type); + }); + } + return res; + } + const values = []; + for (let i = 0; i < fn.length; i++) { + values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); + } + return values; +} +function handleError(err, instance, type, throwInDev = true) { + const contextVNode = instance ? instance.vnode : null; + if (instance) { + let cur = instance.parent; + const exposedInstance = instance.proxy; + const errorInfo = `https://vuejs.org/error-reference/#runtime-${type}`; + while (cur) { + const errorCapturedHooks = cur.ec; + if (errorCapturedHooks) { + for (let i = 0; i < errorCapturedHooks.length; i++) { + if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { + return; + } + } + } + cur = cur.parent; + } + const appErrorHandler = instance.appContext.config.errorHandler; + if (appErrorHandler) { + callWithErrorHandling( + appErrorHandler, + null, + 10, + [err, exposedInstance, errorInfo] + ); + return; + } + } + logError(err, type, contextVNode, throwInDev); +} +function logError(err, type, contextVNode, throwInDev = true) { + { + console.error(err); + } +} +let isFlushing = false; +let isFlushPending = false; +const queue = []; +let flushIndex = 0; +const pendingPostFlushCbs = []; +let activePostFlushCbs = null; +let postFlushIndex = 0; +const resolvedPromise = /* @__PURE__ */ Promise.resolve(); +let currentFlushPromise = null; +function nextTick(fn) { + const p2 = currentFlushPromise || resolvedPromise; + return fn ? p2.then(this ? fn.bind(this) : fn) : p2; +} +function findInsertionIndex(id2) { + let start = flushIndex + 1; + let end3 = queue.length; + while (start < end3) { + const middle = start + end3 >>> 1; + const middleJob = queue[middle]; + const middleJobId = getId(middleJob); + if (middleJobId < id2 || middleJobId === id2 && middleJob.pre) { + start = middle + 1; + } else { + end3 = middle; + } + } + return start; +} +function queueJob(job) { + if (!queue.length || !queue.includes( + job, + isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex + )) { + if (job.id == null) { + queue.push(job); + } else { + queue.splice(findInsertionIndex(job.id), 0, job); + } + queueFlush(); + } +} +function queueFlush() { + if (!isFlushing && !isFlushPending) { + isFlushPending = true; + currentFlushPromise = resolvedPromise.then(flushJobs); + } +} +function invalidateJob(job) { + const i = queue.indexOf(job); + if (i > flushIndex) { + queue.splice(i, 1); + } +} +function queuePostFlushCb(cb) { + if (!isArray$1(cb)) { + if (!activePostFlushCbs || !activePostFlushCbs.includes( + cb, + cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex + )) { + pendingPostFlushCbs.push(cb); + } + } else { + pendingPostFlushCbs.push(...cb); + } + queueFlush(); +} +function flushPreFlushCbs(instance, seen2, i = isFlushing ? flushIndex + 1 : 0) { + for (; i < queue.length; i++) { + const cb = queue[i]; + if (cb && cb.pre) { + if (instance && cb.id !== instance.uid) { + continue; + } + queue.splice(i, 1); + i--; + cb(); + } + } +} +function flushPostFlushCbs(seen2) { + if (pendingPostFlushCbs.length) { + const deduped = [...new Set(pendingPostFlushCbs)].sort( + (a, b) => getId(a) - getId(b) + ); + pendingPostFlushCbs.length = 0; + if (activePostFlushCbs) { + activePostFlushCbs.push(...deduped); + return; + } + activePostFlushCbs = deduped; + for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { + activePostFlushCbs[postFlushIndex](); + } + activePostFlushCbs = null; + postFlushIndex = 0; + } +} +const getId = (job) => job.id == null ? Infinity : job.id; +const comparator = (a, b) => { + const diff = getId(a) - getId(b); + if (diff === 0) { + if (a.pre && !b.pre) + return -1; + if (b.pre && !a.pre) + return 1; + } + return diff; +}; +function flushJobs(seen2) { + isFlushPending = false; + isFlushing = true; + queue.sort(comparator); + try { + for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { + const job = queue[flushIndex]; + if (job && job.active !== false) { + if (false) + ; + callWithErrorHandling(job, null, 14); + } + } + } finally { + flushIndex = 0; + queue.length = 0; + flushPostFlushCbs(); + isFlushing = false; + currentFlushPromise = null; + if (queue.length || pendingPostFlushCbs.length) { + flushJobs(); + } + } +} +let devtools$1; +let buffer = []; +function setDevtoolsHook$1(hook, target) { + var _a, _b; + devtools$1 = hook; + if (devtools$1) { + devtools$1.enabled = true; + buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args)); + buffer = []; + } else if ( + // handle late devtools injection - only do this if we are in an actual + // browser environment to avoid the timer handle stalling test runner exit + // (#4815) + typeof window !== "undefined" && // some envs mock window but not fully + window.HTMLElement && // also exclude jsdom + !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom")) + ) { + const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; + replay.push((newHook) => { + setDevtoolsHook$1(newHook, target); + }); + setTimeout(() => { + if (!devtools$1) { + target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; + buffer = []; + } + }, 3e3); + } else { + buffer = []; + } +} +function emit(instance, event, ...rawArgs) { + if (instance.isUnmounted) + return; + const props = instance.vnode.props || EMPTY_OBJ; + let args = rawArgs; + const isModelListener2 = event.startsWith("update:"); + const modelArg = isModelListener2 && event.slice(7); + if (modelArg && modelArg in props) { + const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`; + const { number, trim: trim2 } = props[modifiersKey] || EMPTY_OBJ; + if (trim2) { + args = rawArgs.map((a) => isString$1(a) ? a.trim() : a); + } + if (number) { + args = rawArgs.map(looseToNumber); + } + } + let handlerName; + let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249) + props[handlerName = toHandlerKey(camelize(event))]; + if (!handler && isModelListener2) { + handler = props[handlerName = toHandlerKey(hyphenate(event))]; + } + if (handler) { + callWithAsyncErrorHandling( + handler, + instance, + 6, + args + ); + } + const onceHandler = props[handlerName + `Once`]; + if (onceHandler) { + if (!instance.emitted) { + instance.emitted = {}; + } else if (instance.emitted[handlerName]) { + return; + } + instance.emitted[handlerName] = true; + callWithAsyncErrorHandling( + onceHandler, + instance, + 6, + args + ); + } +} +function normalizeEmitsOptions(comp, appContext, asMixin = false) { + const cache = appContext.emitsCache; + const cached = cache.get(comp); + if (cached !== void 0) { + return cached; + } + const raw = comp.emits; + let normalized = {}; + let hasExtends = false; + if (!isFunction$1(comp)) { + const extendEmits = (raw2) => { + const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); + if (normalizedFromExtend) { + hasExtends = true; + extend$1(normalized, normalizedFromExtend); + } + }; + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendEmits); + } + if (comp.extends) { + extendEmits(comp.extends); + } + if (comp.mixins) { + comp.mixins.forEach(extendEmits); + } + } + if (!raw && !hasExtends) { + if (isObject$6(comp)) { + cache.set(comp, null); + } + return null; + } + if (isArray$1(raw)) { + raw.forEach((key) => normalized[key] = null); + } else { + extend$1(normalized, raw); + } + if (isObject$6(comp)) { + cache.set(comp, normalized); + } + return normalized; +} +function isEmitListener(options, key) { + if (!options || !isOn(key)) { + return false; + } + key = key.slice(2).replace(/Once$/, ""); + return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key); +} +let currentRenderingInstance = null; +let currentScopeId = null; +function setCurrentRenderingInstance(instance) { + const prev = currentRenderingInstance; + currentRenderingInstance = instance; + currentScopeId = instance && instance.type.__scopeId || null; + return prev; +} +function pushScopeId(id2) { + currentScopeId = id2; +} +function popScopeId() { + currentScopeId = null; +} +const withScopeId = (_id) => withCtx; +function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { + if (!ctx) + return fn; + if (fn._n) { + return fn; + } + const renderFnWithContext = (...args) => { + if (renderFnWithContext._d) { + setBlockTracking(-1); + } + const prevInstance = setCurrentRenderingInstance(ctx); + let res; + try { + res = fn(...args); + } finally { + setCurrentRenderingInstance(prevInstance); + if (renderFnWithContext._d) { + setBlockTracking(1); + } + } + return res; + }; + renderFnWithContext._n = true; + renderFnWithContext._c = true; + renderFnWithContext._d = true; + return renderFnWithContext; +} +function markAttrsAccessed() { +} +function renderComponentRoot(instance) { + const { + type: Component, + vnode, + proxy, + withProxy, + props, + propsOptions: [propsOptions], + slots, + attrs, + emit: emit2, + render: render3, + renderCache, + data, + setupState, + ctx, + inheritAttrs + } = instance; + let result; + let fallthroughAttrs; + const prev = setCurrentRenderingInstance(instance); + try { + if (vnode.shapeFlag & 4) { + const proxyToUse = withProxy || proxy; + const thisProxy = false ? new Proxy(proxyToUse, { + get(target, key, receiver) { + warn$1( + `Property '${String( + key + )}' was accessed via 'this'. Avoid using 'this' in templates.` + ); + return Reflect.get(target, key, receiver); + } + }) : proxyToUse; + result = normalizeVNode( + render3.call( + thisProxy, + proxyToUse, + renderCache, + props, + setupState, + data, + ctx + ) + ); + fallthroughAttrs = attrs; + } else { + const render22 = Component; + if (false) + ; + result = normalizeVNode( + render22.length > 1 ? render22( + props, + false ? { + get attrs() { + markAttrsAccessed(); + return attrs; + }, + slots, + emit: emit2 + } : { attrs, slots, emit: emit2 } + ) : render22( + props, + null + /* we know it doesn't need it */ + ) + ); + fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs); + } + } catch (err) { + blockStack.length = 0; + handleError(err, instance, 1); + result = createVNode(Comment); + } + let root2 = result; + if (fallthroughAttrs && inheritAttrs !== false) { + const keys = Object.keys(fallthroughAttrs); + const { shapeFlag } = root2; + if (keys.length) { + if (shapeFlag & (1 | 6)) { + if (propsOptions && keys.some(isModelListener)) { + fallthroughAttrs = filterModelListeners( + fallthroughAttrs, + propsOptions + ); + } + root2 = cloneVNode(root2, fallthroughAttrs); + } + } + } + if (vnode.dirs) { + root2 = cloneVNode(root2); + root2.dirs = root2.dirs ? root2.dirs.concat(vnode.dirs) : vnode.dirs; + } + if (vnode.transition) { + root2.transition = vnode.transition; + } + { + result = root2; + } + setCurrentRenderingInstance(prev); + return result; +} +function filterSingleRoot(children, recurse = true) { + let singleRoot; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (isVNode(child)) { + if (child.type !== Comment || child.children === "v-if") { + if (singleRoot) { + return; + } else { + singleRoot = child; + } + } + } else { + return; + } + } + return singleRoot; +} +const getFunctionalFallthrough = (attrs) => { + let res; + for (const key in attrs) { + if (key === "class" || key === "style" || isOn(key)) { + (res || (res = {}))[key] = attrs[key]; + } + } + return res; +}; +const filterModelListeners = (attrs, props) => { + const res = {}; + for (const key in attrs) { + if (!isModelListener(key) || !(key.slice(9) in props)) { + res[key] = attrs[key]; + } + } + return res; +}; +function shouldUpdateComponent(prevVNode, nextVNode, optimized) { + const { props: prevProps, children: prevChildren, component } = prevVNode; + const { props: nextProps, children: nextChildren, patchFlag } = nextVNode; + const emits = component.emitsOptions; + if (nextVNode.dirs || nextVNode.transition) { + return true; + } + if (optimized && patchFlag >= 0) { + if (patchFlag & 1024) { + return true; + } + if (patchFlag & 16) { + if (!prevProps) { + return !!nextProps; + } + return hasPropsChanged(prevProps, nextProps, emits); + } else if (patchFlag & 8) { + const dynamicProps = nextVNode.dynamicProps; + for (let i = 0; i < dynamicProps.length; i++) { + const key = dynamicProps[i]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) { + return true; + } + } + } + } else { + if (prevChildren || nextChildren) { + if (!nextChildren || !nextChildren.$stable) { + return true; + } + } + if (prevProps === nextProps) { + return false; + } + if (!prevProps) { + return !!nextProps; + } + if (!nextProps) { + return true; + } + return hasPropsChanged(prevProps, nextProps, emits); + } + return false; +} +function hasPropsChanged(prevProps, nextProps, emitsOptions) { + const nextKeys = Object.keys(nextProps); + if (nextKeys.length !== Object.keys(prevProps).length) { + return true; + } + for (let i = 0; i < nextKeys.length; i++) { + const key = nextKeys[i]; + if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) { + return true; + } + } + return false; +} +function updateHOCHostEl({ vnode, parent }, el) { + while (parent) { + const root2 = parent.subTree; + if (root2.suspense && root2.suspense.activeBranch === vnode) { + root2.el = vnode.el; + } + if (root2 === vnode) { + (vnode = parent.vnode).el = el; + parent = parent.parent; + } else { + break; + } + } +} +const COMPONENTS = "components"; +const DIRECTIVES = "directives"; +function resolveComponent(name, maybeSelfReference) { + return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; +} +const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); +function resolveDynamicComponent(component) { + if (isString$1(component)) { + return resolveAsset(COMPONENTS, component, false) || component; + } else { + return component || NULL_DYNAMIC_COMPONENT; + } +} +function resolveDirective(name) { + return resolveAsset(DIRECTIVES, name); +} +function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { + const instance = currentRenderingInstance || currentInstance; + if (instance) { + const Component = instance.type; + if (type === COMPONENTS) { + const selfName = getComponentName( + Component, + false + ); + if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) { + return Component; + } + } + const res = ( + // local registration + // check instance[type] first which is resolved for options API + resolve(instance[type] || Component[type], name) || // global registration + resolve(instance.appContext[type], name) + ); + if (!res && maybeSelfReference) { + return Component; + } + return res; + } +} +function resolve(registry, name) { + return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]); +} +const isSuspense = (type) => type.__isSuspense; +let suspenseId = 0; +const SuspenseImpl = { + name: "Suspense", + // In order to make Suspense tree-shakable, we need to avoid importing it + // directly in the renderer. The renderer checks for the __isSuspense flag + // on a vnode's type and calls the `process` method, passing in renderer + // internals. + __isSuspense: true, + process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace2, slotScopeIds, optimized, rendererInternals) { + if (n1 == null) { + mountSuspense( + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized, + rendererInternals + ); + } else { + if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) { + n2.suspense = n1.suspense; + n2.suspense.vnode = n2; + n2.el = n1.el; + return; + } + patchSuspense( + n1, + n2, + container, + anchor, + parentComponent, + namespace2, + slotScopeIds, + optimized, + rendererInternals + ); + } + }, + hydrate: hydrateSuspense, + create: createSuspenseBoundary, + normalize: normalizeSuspenseChildren +}; +const Suspense = SuspenseImpl; +function triggerEvent(vnode, name) { + const eventListener = vnode.props && vnode.props[name]; + if (isFunction$1(eventListener)) { + eventListener(); + } +} +function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace2, slotScopeIds, optimized, rendererInternals) { + const { + p: patch, + o: { createElement: createElement2 } + } = rendererInternals; + const hiddenContainer = createElement2("div"); + const suspense = vnode.suspense = createSuspenseBoundary( + vnode, + parentSuspense, + parentComponent, + container, + hiddenContainer, + anchor, + namespace2, + slotScopeIds, + optimized, + rendererInternals + ); + patch( + null, + suspense.pendingBranch = vnode.ssContent, + hiddenContainer, + null, + parentComponent, + suspense, + namespace2, + slotScopeIds + ); + if (suspense.deps > 0) { + triggerEvent(vnode, "onPending"); + triggerEvent(vnode, "onFallback"); + patch( + null, + vnode.ssFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + namespace2, + slotScopeIds + ); + setActiveBranch(suspense, vnode.ssFallback); + } else { + suspense.resolve(false, true); + } +} +function patchSuspense(n1, n2, container, anchor, parentComponent, namespace2, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement: createElement2 } }) { + const suspense = n2.suspense = n1.suspense; + suspense.vnode = n2; + n2.el = n1.el; + const newBranch = n2.ssContent; + const newFallback = n2.ssFallback; + const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense; + if (pendingBranch) { + suspense.pendingBranch = newBranch; + if (isSameVNodeType(newBranch, pendingBranch)) { + patch( + pendingBranch, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace2, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } else if (isInFallback) { + if (!isHydrating) { + patch( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + namespace2, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } + } + } else { + suspense.pendingId = suspenseId++; + if (isHydrating) { + suspense.isHydrating = false; + suspense.activeBranch = pendingBranch; + } else { + unmount(pendingBranch, parentComponent, suspense); + } + suspense.deps = 0; + suspense.effects.length = 0; + suspense.hiddenContainer = createElement2("div"); + if (isInFallback) { + patch( + null, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace2, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + patch( + activeBranch, + newFallback, + container, + anchor, + parentComponent, + null, + // fallback tree will not have suspense context + namespace2, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newFallback); + } + } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch( + activeBranch, + newBranch, + container, + anchor, + parentComponent, + suspense, + namespace2, + slotScopeIds, + optimized + ); + suspense.resolve(true); + } else { + patch( + null, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace2, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } + } + } + } else { + if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { + patch( + activeBranch, + newBranch, + container, + anchor, + parentComponent, + suspense, + namespace2, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, newBranch); + } else { + triggerEvent(n2, "onPending"); + suspense.pendingBranch = newBranch; + if (newBranch.shapeFlag & 512) { + suspense.pendingId = newBranch.component.suspenseId; + } else { + suspense.pendingId = suspenseId++; + } + patch( + null, + newBranch, + suspense.hiddenContainer, + null, + parentComponent, + suspense, + namespace2, + slotScopeIds, + optimized + ); + if (suspense.deps <= 0) { + suspense.resolve(); + } else { + const { timeout, pendingId } = suspense; + if (timeout > 0) { + setTimeout(() => { + if (suspense.pendingId === pendingId) { + suspense.fallback(newFallback); + } + }, timeout); + } else if (timeout === 0) { + suspense.fallback(newFallback); + } + } + } + } +} +function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace2, slotScopeIds, optimized, rendererInternals, isHydrating = false) { + const { + p: patch, + m: move, + um: unmount, + n: next, + o: { parentNode, remove: remove2 } + } = rendererInternals; + let parentSuspenseId; + const isSuspensible = isVNodeSuspensible(vnode); + if (isSuspensible) { + if (parentSuspense == null ? void 0 : parentSuspense.pendingBranch) { + parentSuspenseId = parentSuspense.pendingId; + parentSuspense.deps++; + } + } + const timeout = vnode.props ? toNumber$2(vnode.props.timeout) : void 0; + const initialAnchor = anchor; + const suspense = { + vnode, + parent: parentSuspense, + parentComponent, + namespace: namespace2, + container, + hiddenContainer, + deps: 0, + pendingId: suspenseId++, + timeout: typeof timeout === "number" ? timeout : -1, + activeBranch: null, + pendingBranch: null, + isInFallback: !isHydrating, + isHydrating, + isUnmounted: false, + effects: [], + resolve(resume = false, sync = false) { + const { + vnode: vnode2, + activeBranch, + pendingBranch, + pendingId, + effects, + parentComponent: parentComponent2, + container: container2 + } = suspense; + let delayEnter = false; + if (suspense.isHydrating) { + suspense.isHydrating = false; + } else if (!resume) { + delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = () => { + if (pendingId === suspense.pendingId) { + move( + pendingBranch, + container2, + anchor === initialAnchor ? next(activeBranch) : anchor, + 0 + ); + queuePostFlushCb(effects); + } + }; + } + if (activeBranch) { + if (parentNode(activeBranch.el) !== suspense.hiddenContainer) { + anchor = next(activeBranch); + } + unmount(activeBranch, parentComponent2, suspense, true); + } + if (!delayEnter) { + move(pendingBranch, container2, anchor, 0); + } + } + setActiveBranch(suspense, pendingBranch); + suspense.pendingBranch = null; + suspense.isInFallback = false; + let parent = suspense.parent; + let hasUnresolvedAncestor = false; + while (parent) { + if (parent.pendingBranch) { + parent.effects.push(...effects); + hasUnresolvedAncestor = true; + break; + } + parent = parent.parent; + } + if (!hasUnresolvedAncestor && !delayEnter) { + queuePostFlushCb(effects); + } + suspense.effects = []; + if (isSuspensible) { + if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) { + parentSuspense.deps--; + if (parentSuspense.deps === 0 && !sync) { + parentSuspense.resolve(); + } + } + } + triggerEvent(vnode2, "onResolve"); + }, + fallback(fallbackVNode) { + if (!suspense.pendingBranch) { + return; + } + const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace22 } = suspense; + triggerEvent(vnode2, "onFallback"); + const anchor2 = next(activeBranch); + const mountFallback = () => { + if (!suspense.isInFallback) { + return; + } + patch( + null, + fallbackVNode, + container2, + anchor2, + parentComponent2, + null, + // fallback tree will not have suspense context + namespace22, + slotScopeIds, + optimized + ); + setActiveBranch(suspense, fallbackVNode); + }; + const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in"; + if (delayEnter) { + activeBranch.transition.afterLeave = mountFallback; + } + suspense.isInFallback = true; + unmount( + activeBranch, + parentComponent2, + null, + // no suspense so unmount hooks fire now + true + // shouldRemove + ); + if (!delayEnter) { + mountFallback(); + } + }, + move(container2, anchor2, type) { + suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type); + suspense.container = container2; + }, + next() { + return suspense.activeBranch && next(suspense.activeBranch); + }, + registerDep(instance, setupRenderEffect) { + const isInPendingSuspense = !!suspense.pendingBranch; + if (isInPendingSuspense) { + suspense.deps++; + } + const hydratedEl = instance.vnode.el; + instance.asyncDep.catch((err) => { + handleError(err, instance, 0); + }).then((asyncSetupResult) => { + if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) { + return; + } + instance.asyncResolved = true; + const { vnode: vnode2 } = instance; + handleSetupResult(instance, asyncSetupResult, false); + if (hydratedEl) { + vnode2.el = hydratedEl; + } + const placeholder = !hydratedEl && instance.subTree.el; + setupRenderEffect( + instance, + vnode2, + // component may have been moved before resolve. + // if this is not a hydration, instance.subTree will be the comment + // placeholder. + parentNode(hydratedEl || instance.subTree.el), + // anchor will not be used if this is hydration, so only need to + // consider the comment placeholder case. + hydratedEl ? null : next(instance.subTree), + suspense, + namespace2, + optimized + ); + if (placeholder) { + remove2(placeholder); + } + updateHOCHostEl(instance, vnode2.el); + if (isInPendingSuspense && --suspense.deps === 0) { + suspense.resolve(); + } + }); + }, + unmount(parentSuspense2, doRemove) { + suspense.isUnmounted = true; + if (suspense.activeBranch) { + unmount( + suspense.activeBranch, + parentComponent, + parentSuspense2, + doRemove + ); + } + if (suspense.pendingBranch) { + unmount( + suspense.pendingBranch, + parentComponent, + parentSuspense2, + doRemove + ); + } + } + }; + return suspense; +} +function hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace2, slotScopeIds, optimized, rendererInternals, hydrateNode) { + const suspense = vnode.suspense = createSuspenseBoundary( + vnode, + parentSuspense, + parentComponent, + node.parentNode, + // eslint-disable-next-line no-restricted-globals + document.createElement("div"), + null, + namespace2, + slotScopeIds, + optimized, + rendererInternals, + true + ); + const result = hydrateNode( + node, + suspense.pendingBranch = vnode.ssContent, + parentComponent, + suspense, + slotScopeIds, + optimized + ); + if (suspense.deps === 0) { + suspense.resolve(false, true); + } + return result; +} +function normalizeSuspenseChildren(vnode) { + const { shapeFlag, children } = vnode; + const isSlotChildren = shapeFlag & 32; + vnode.ssContent = normalizeSuspenseSlot( + isSlotChildren ? children.default : children + ); + vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment); +} +function normalizeSuspenseSlot(s) { + let block; + if (isFunction$1(s)) { + const trackBlock = isBlockTreeEnabled && s._c; + if (trackBlock) { + s._d = false; + openBlock(); + } + s = s(); + if (trackBlock) { + s._d = true; + block = currentBlock; + closeBlock(); + } + } + if (isArray$1(s)) { + const singleChild = filterSingleRoot(s); + s = singleChild; + } + s = normalizeVNode(s); + if (block && !s.dynamicChildren) { + s.dynamicChildren = block.filter((c) => c !== s); + } + return s; +} +function queueEffectWithSuspense(fn, suspense) { + if (suspense && suspense.pendingBranch) { + if (isArray$1(fn)) { + suspense.effects.push(...fn); + } else { + suspense.effects.push(fn); + } + } else { + queuePostFlushCb(fn); + } +} +function setActiveBranch(suspense, branch) { + suspense.activeBranch = branch; + const { vnode, parentComponent } = suspense; + let el = branch.el; + while (!el && branch.component) { + branch = branch.component.subTree; + el = branch.el; + } + vnode.el = el; + if (parentComponent && parentComponent.subTree === vnode) { + parentComponent.vnode.el = el; + updateHOCHostEl(parentComponent, el); + } +} +function isVNodeSuspensible(vnode) { + var _a; + return ((_a = vnode.props) == null ? void 0 : _a.suspensible) != null && vnode.props.suspensible !== false; +} +const ssrContextKey = Symbol.for("v-scx"); +const useSSRContext = () => { + { + const ctx = inject(ssrContextKey); + return ctx; + } +}; +function watchEffect(effect2, options) { + return doWatch(effect2, null, options); +} +function watchPostEffect(effect2, options) { + return doWatch( + effect2, + null, + { flush: "post" } + ); +} +function watchSyncEffect(effect2, options) { + return doWatch( + effect2, + null, + { flush: "sync" } + ); +} +const INITIAL_WATCHER_VALUE = {}; +function watch(source, cb, options) { + return doWatch(source, cb, options); +} +function doWatch(source, cb, { + immediate, + deep, + flush, + once, + onTrack, + onTrigger +} = EMPTY_OBJ) { + if (cb && once) { + const _cb = cb; + cb = (...args) => { + _cb(...args); + unwatch(); + }; + } + const instance = currentInstance; + const reactiveGetter = (source2) => deep === true ? source2 : ( + // for deep: false, only traverse root-level properties + traverse(source2, deep === false ? 1 : void 0) + ); + let getter; + let forceTrigger = false; + let isMultiSource = false; + if (isRef(source)) { + getter = () => source.value; + forceTrigger = isShallow(source); + } else if (isReactive(source)) { + getter = () => reactiveGetter(source); + forceTrigger = true; + } else if (isArray$1(source)) { + isMultiSource = true; + forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); + getter = () => source.map((s) => { + if (isRef(s)) { + return s.value; + } else if (isReactive(s)) { + return reactiveGetter(s); + } else if (isFunction$1(s)) { + return callWithErrorHandling(s, instance, 2); + } else + ; + }); + } else if (isFunction$1(source)) { + if (cb) { + getter = () => callWithErrorHandling(source, instance, 2); + } else { + getter = () => { + if (cleanup) { + cleanup(); + } + return callWithAsyncErrorHandling( + source, + instance, + 3, + [onCleanup] + ); + }; + } + } else { + getter = NOOP; + } + if (cb && deep) { + const baseGetter = getter; + getter = () => traverse(baseGetter()); + } + let cleanup; + let onCleanup = (fn) => { + cleanup = effect2.onStop = () => { + callWithErrorHandling(fn, instance, 4); + cleanup = effect2.onStop = void 0; + }; + }; + let ssrCleanup; + if (isInSSRComponentSetup) { + onCleanup = NOOP; + if (!cb) { + getter(); + } else if (immediate) { + callWithAsyncErrorHandling(cb, instance, 3, [ + getter(), + isMultiSource ? [] : void 0, + onCleanup + ]); + } + if (flush === "sync") { + const ctx = useSSRContext(); + ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []); + } else { + return NOOP; + } + } + let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; + const job = () => { + if (!effect2.active || !effect2.dirty) { + return; + } + if (cb) { + const newValue = effect2.run(); + if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) { + if (cleanup) { + cleanup(); + } + callWithAsyncErrorHandling(cb, instance, 3, [ + newValue, + // pass undefined as the old value when it's changed for the first time + oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, + onCleanup + ]); + oldValue = newValue; + } + } else { + effect2.run(); + } + }; + job.allowRecurse = !!cb; + let scheduler; + if (flush === "sync") { + scheduler = job; + } else if (flush === "post") { + scheduler = () => queuePostRenderEffect(job, instance && instance.suspense); + } else { + job.pre = true; + if (instance) + job.id = instance.uid; + scheduler = () => queueJob(job); + } + const effect2 = new ReactiveEffect(getter, NOOP, scheduler); + const scope = getCurrentScope(); + const unwatch = () => { + effect2.stop(); + if (scope) { + remove(scope.effects, effect2); + } + }; + if (cb) { + if (immediate) { + job(); + } else { + oldValue = effect2.run(); + } + } else if (flush === "post") { + queuePostRenderEffect( + effect2.run.bind(effect2), + instance && instance.suspense + ); + } else { + effect2.run(); + } + if (ssrCleanup) + ssrCleanup.push(unwatch); + return unwatch; +} +function instanceWatch(source, value, options) { + const publicThis = this.proxy; + const getter = isString$1(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis); + let cb; + if (isFunction$1(value)) { + cb = value; + } else { + cb = value.handler; + options = value; + } + const reset2 = setCurrentInstance(this); + const res = doWatch(getter, cb.bind(publicThis), options); + reset2(); + return res; +} +function createPathGetter(ctx, path) { + const segments = path.split("."); + return () => { + let cur = ctx; + for (let i = 0; i < segments.length && cur; i++) { + cur = cur[segments[i]]; + } + return cur; + }; +} +function traverse(value, depth, currentDepth = 0, seen2) { + if (!isObject$6(value) || value["__v_skip"]) { + return value; + } + if (depth && depth > 0) { + if (currentDepth >= depth) { + return value; + } + currentDepth++; + } + seen2 = seen2 || /* @__PURE__ */ new Set(); + if (seen2.has(value)) { + return value; + } + seen2.add(value); + if (isRef(value)) { + traverse(value.value, depth, currentDepth, seen2); + } else if (isArray$1(value)) { + for (let i = 0; i < value.length; i++) { + traverse(value[i], depth, currentDepth, seen2); + } + } else if (isSet(value) || isMap(value)) { + value.forEach((v) => { + traverse(v, depth, currentDepth, seen2); + }); + } else if (isPlainObject$1(value)) { + for (const key in value) { + traverse(value[key], depth, currentDepth, seen2); + } + } + return value; +} +function withDirectives(vnode, directives) { + if (currentRenderingInstance === null) { + return vnode; + } + const instance = getExposeProxy(currentRenderingInstance) || currentRenderingInstance.proxy; + const bindings = vnode.dirs || (vnode.dirs = []); + for (let i = 0; i < directives.length; i++) { + let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]; + if (dir) { + if (isFunction$1(dir)) { + dir = { + mounted: dir, + updated: dir + }; + } + if (dir.deep) { + traverse(value); + } + bindings.push({ + dir, + instance, + value, + oldValue: void 0, + arg, + modifiers + }); + } + } + return vnode; +} +function invokeDirectiveHook(vnode, prevVNode, instance, name) { + const bindings = vnode.dirs; + const oldBindings = prevVNode && prevVNode.dirs; + for (let i = 0; i < bindings.length; i++) { + const binding = bindings[i]; + if (oldBindings) { + binding.oldValue = oldBindings[i].value; + } + let hook = binding.dir[name]; + if (hook) { + pauseTracking(); + callWithAsyncErrorHandling(hook, instance, 8, [ + vnode.el, + binding, + vnode, + prevVNode + ]); + resetTracking(); + } + } +} +const leaveCbKey = Symbol("_leaveCb"); +const enterCbKey$1 = Symbol("_enterCb"); +function useTransitionState() { + const state = { + isMounted: false, + isLeaving: false, + isUnmounting: false, + leavingVNodes: /* @__PURE__ */ new Map() + }; + onMounted(() => { + state.isMounted = true; + }); + onBeforeUnmount(() => { + state.isUnmounting = true; + }); + return state; +} +const TransitionHookValidator = [Function, Array]; +const BaseTransitionPropsValidators = { + mode: String, + appear: Boolean, + persisted: Boolean, + // enter + onBeforeEnter: TransitionHookValidator, + onEnter: TransitionHookValidator, + onAfterEnter: TransitionHookValidator, + onEnterCancelled: TransitionHookValidator, + // leave + onBeforeLeave: TransitionHookValidator, + onLeave: TransitionHookValidator, + onAfterLeave: TransitionHookValidator, + onLeaveCancelled: TransitionHookValidator, + // appear + onBeforeAppear: TransitionHookValidator, + onAppear: TransitionHookValidator, + onAfterAppear: TransitionHookValidator, + onAppearCancelled: TransitionHookValidator +}; +const BaseTransitionImpl = { + name: `BaseTransition`, + props: BaseTransitionPropsValidators, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const state = useTransitionState(); + return () => { + const children = slots.default && getTransitionRawChildren(slots.default(), true); + if (!children || !children.length) { + return; + } + let child = children[0]; + if (children.length > 1) { + for (const c of children) { + if (c.type !== Comment) { + child = c; + break; + } + } + } + const rawProps = toRaw(props); + const { mode } = rawProps; + if (state.isLeaving) { + return emptyPlaceholder(child); + } + const innerChild = getKeepAliveChild(child); + if (!innerChild) { + return emptyPlaceholder(child); + } + const enterHooks = resolveTransitionHooks( + innerChild, + rawProps, + state, + instance + ); + setTransitionHooks(innerChild, enterHooks); + const oldChild = instance.subTree; + const oldInnerChild = oldChild && getKeepAliveChild(oldChild); + if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild)) { + const leavingHooks = resolveTransitionHooks( + oldInnerChild, + rawProps, + state, + instance + ); + setTransitionHooks(oldInnerChild, leavingHooks); + if (mode === "out-in") { + state.isLeaving = true; + leavingHooks.afterLeave = () => { + state.isLeaving = false; + if (instance.update.active !== false) { + instance.effect.dirty = true; + instance.update(); + } + }; + return emptyPlaceholder(child); + } else if (mode === "in-out" && innerChild.type !== Comment) { + leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { + const leavingVNodesCache = getLeavingNodesForType( + state, + oldInnerChild + ); + leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; + el[leaveCbKey] = () => { + earlyRemove(); + el[leaveCbKey] = void 0; + delete enterHooks.delayedLeave; + }; + enterHooks.delayedLeave = delayedLeave; + }; + } + } + return child; + }; + } +}; +const BaseTransition = BaseTransitionImpl; +function getLeavingNodesForType(state, vnode) { + const { leavingVNodes } = state; + let leavingVNodesCache = leavingVNodes.get(vnode.type); + if (!leavingVNodesCache) { + leavingVNodesCache = /* @__PURE__ */ Object.create(null); + leavingVNodes.set(vnode.type, leavingVNodesCache); + } + return leavingVNodesCache; +} +function resolveTransitionHooks(vnode, props, state, instance) { + const { + appear, + mode, + persisted = false, + onBeforeEnter, + onEnter, + onAfterEnter, + onEnterCancelled, + onBeforeLeave, + onLeave, + onAfterLeave, + onLeaveCancelled, + onBeforeAppear, + onAppear, + onAfterAppear, + onAppearCancelled + } = props; + const key = String(vnode.key); + const leavingVNodesCache = getLeavingNodesForType(state, vnode); + const callHook2 = (hook, args) => { + hook && callWithAsyncErrorHandling( + hook, + instance, + 9, + args + ); + }; + const callAsyncHook = (hook, args) => { + const done = args[1]; + callHook2(hook, args); + if (isArray$1(hook)) { + if (hook.every((hook2) => hook2.length <= 1)) + done(); + } else if (hook.length <= 1) { + done(); + } + }; + const hooks8 = { + mode, + persisted, + beforeEnter(el) { + let hook = onBeforeEnter; + if (!state.isMounted) { + if (appear) { + hook = onBeforeAppear || onBeforeEnter; + } else { + return; + } + } + if (el[leaveCbKey]) { + el[leaveCbKey]( + true + /* cancelled */ + ); + } + const leavingVNode = leavingVNodesCache[key]; + if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) { + leavingVNode.el[leaveCbKey](); + } + callHook2(hook, [el]); + }, + enter(el) { + let hook = onEnter; + let afterHook = onAfterEnter; + let cancelHook = onEnterCancelled; + if (!state.isMounted) { + if (appear) { + hook = onAppear || onEnter; + afterHook = onAfterAppear || onAfterEnter; + cancelHook = onAppearCancelled || onEnterCancelled; + } else { + return; + } + } + let called = false; + const done = el[enterCbKey$1] = (cancelled) => { + if (called) + return; + called = true; + if (cancelled) { + callHook2(cancelHook, [el]); + } else { + callHook2(afterHook, [el]); + } + if (hooks8.delayedLeave) { + hooks8.delayedLeave(); + } + el[enterCbKey$1] = void 0; + }; + if (hook) { + callAsyncHook(hook, [el, done]); + } else { + done(); + } + }, + leave(el, remove2) { + const key2 = String(vnode.key); + if (el[enterCbKey$1]) { + el[enterCbKey$1]( + true + /* cancelled */ + ); + } + if (state.isUnmounting) { + return remove2(); + } + callHook2(onBeforeLeave, [el]); + let called = false; + const done = el[leaveCbKey] = (cancelled) => { + if (called) + return; + called = true; + remove2(); + if (cancelled) { + callHook2(onLeaveCancelled, [el]); + } else { + callHook2(onAfterLeave, [el]); + } + el[leaveCbKey] = void 0; + if (leavingVNodesCache[key2] === vnode) { + delete leavingVNodesCache[key2]; + } + }; + leavingVNodesCache[key2] = vnode; + if (onLeave) { + callAsyncHook(onLeave, [el, done]); + } else { + done(); + } + }, + clone(vnode2) { + return resolveTransitionHooks(vnode2, props, state, instance); + } + }; + return hooks8; +} +function emptyPlaceholder(vnode) { + if (isKeepAlive(vnode)) { + vnode = cloneVNode(vnode); + vnode.children = null; + return vnode; + } +} +function getKeepAliveChild(vnode) { + return isKeepAlive(vnode) ? ( + // #7121 ensure get the child component subtree in case + // it's been replaced during HMR + vnode.children ? vnode.children[0] : void 0 + ) : vnode; +} +function setTransitionHooks(vnode, hooks8) { + if (vnode.shapeFlag & 6 && vnode.component) { + setTransitionHooks(vnode.component.subTree, hooks8); + } else if (vnode.shapeFlag & 128) { + vnode.ssContent.transition = hooks8.clone(vnode.ssContent); + vnode.ssFallback.transition = hooks8.clone(vnode.ssFallback); + } else { + vnode.transition = hooks8; + } +} +function getTransitionRawChildren(children, keepComment = false, parentKey) { + let ret = []; + let keyedFragmentCount = 0; + for (let i = 0; i < children.length; i++) { + let child = children[i]; + const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); + if (child.type === Fragment) { + if (child.patchFlag & 128) + keyedFragmentCount++; + ret = ret.concat( + getTransitionRawChildren(child.children, keepComment, key) + ); + } else if (keepComment || child.type !== Comment) { + ret.push(key != null ? cloneVNode(child, { key }) : child); + } + } + if (keyedFragmentCount > 1) { + for (let i = 0; i < ret.length; i++) { + ret[i].patchFlag = -2; + } + } + return ret; +} +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function defineComponent(options, extraOptions) { + return isFunction$1(options) ? ( + // #8326: extend call and options.name access are considered side-effects + // by Rollup, so we have to wrap it in a pure-annotated IIFE. + /* @__PURE__ */ (() => extend$1({ name: options.name }, extraOptions, { setup: options }))() + ) : options; +} +const isAsyncWrapper = (i) => !!i.type.__asyncLoader; +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function defineAsyncComponent(source) { + if (isFunction$1(source)) { + source = { loader: source }; + } + const { + loader, + loadingComponent, + errorComponent, + delay: delay3 = 200, + timeout, + // undefined = never times out + suspensible = true, + onError: userOnError + } = source; + let pendingRequest = null; + let resolvedComp; + let retries = 0; + const retry = () => { + retries++; + pendingRequest = null; + return load(); + }; + const load = () => { + let thisRequest; + return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => { + err = err instanceof Error ? err : new Error(String(err)); + if (userOnError) { + return new Promise((resolve2, reject) => { + const userRetry = () => resolve2(retry()); + const userFail = () => reject(err); + userOnError(err, userRetry, userFail, retries + 1); + }); + } else { + throw err; + } + }).then((comp) => { + if (thisRequest !== pendingRequest && pendingRequest) { + return pendingRequest; + } + if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) { + comp = comp.default; + } + resolvedComp = comp; + return comp; + })); + }; + return /* @__PURE__ */ defineComponent({ + name: "AsyncComponentWrapper", + __asyncLoader: load, + get __asyncResolved() { + return resolvedComp; + }, + setup() { + const instance = currentInstance; + if (resolvedComp) { + return () => createInnerComp(resolvedComp, instance); + } + const onError = (err) => { + pendingRequest = null; + handleError( + err, + instance, + 13, + !errorComponent + ); + }; + if (suspensible && instance.suspense || isInSSRComponentSetup) { + return load().then((comp) => { + return () => createInnerComp(comp, instance); + }).catch((err) => { + onError(err); + return () => errorComponent ? createVNode(errorComponent, { + error: err + }) : null; + }); + } + const loaded2 = ref(false); + const error = ref(); + const delayed = ref(!!delay3); + if (delay3) { + setTimeout(() => { + delayed.value = false; + }, delay3); + } + if (timeout != null) { + setTimeout(() => { + if (!loaded2.value && !error.value) { + const err = new Error( + `Async component timed out after ${timeout}ms.` + ); + onError(err); + error.value = err; + } + }, timeout); + } + load().then(() => { + loaded2.value = true; + if (instance.parent && isKeepAlive(instance.parent.vnode)) { + instance.parent.effect.dirty = true; + queueJob(instance.parent.update); + } + }).catch((err) => { + onError(err); + error.value = err; + }); + return () => { + if (loaded2.value && resolvedComp) { + return createInnerComp(resolvedComp, instance); + } else if (error.value && errorComponent) { + return createVNode(errorComponent, { + error: error.value + }); + } else if (loadingComponent && !delayed.value) { + return createVNode(loadingComponent); + } + }; + } + }); +} +function createInnerComp(comp, parent) { + const { ref: ref22, props, children, ce } = parent.vnode; + const vnode = createVNode(comp, props, children); + vnode.ref = ref22; + vnode.ce = ce; + delete parent.vnode.ce; + return vnode; +} +const isKeepAlive = (vnode) => vnode.type.__isKeepAlive; +const KeepAliveImpl = { + name: `KeepAlive`, + // Marker for special handling inside the renderer. We are not using a === + // check directly on KeepAlive in the renderer, because importing it directly + // would prevent it from being tree-shaken. + __isKeepAlive: true, + props: { + include: [String, RegExp, Array], + exclude: [String, RegExp, Array], + max: [String, Number] + }, + setup(props, { slots }) { + const instance = getCurrentInstance(); + const sharedContext = instance.ctx; + if (!sharedContext.renderer) { + return () => { + const children = slots.default && slots.default(); + return children && children.length === 1 ? children[0] : children; + }; + } + const cache = /* @__PURE__ */ new Map(); + const keys = /* @__PURE__ */ new Set(); + let current = null; + const parentSuspense = instance.suspense; + const { + renderer: { + p: patch, + m: move, + um: _unmount, + o: { createElement: createElement2 } + } + } = sharedContext; + const storageContainer = createElement2("div"); + sharedContext.activate = (vnode, container, anchor, namespace2, optimized) => { + const instance2 = vnode.component; + move(vnode, container, anchor, 0, parentSuspense); + patch( + instance2.vnode, + vnode, + container, + anchor, + instance2, + parentSuspense, + namespace2, + vnode.slotScopeIds, + optimized + ); + queuePostRenderEffect(() => { + instance2.isDeactivated = false; + if (instance2.a) { + invokeArrayFns(instance2.a); + } + const vnodeHook = vnode.props && vnode.props.onVnodeMounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + }, parentSuspense); + }; + sharedContext.deactivate = (vnode) => { + const instance2 = vnode.component; + move(vnode, storageContainer, null, 1, parentSuspense); + queuePostRenderEffect(() => { + if (instance2.da) { + invokeArrayFns(instance2.da); + } + const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted; + if (vnodeHook) { + invokeVNodeHook(vnodeHook, instance2.parent, vnode); + } + instance2.isDeactivated = true; + }, parentSuspense); + }; + function unmount(vnode) { + resetShapeFlag(vnode); + _unmount(vnode, instance, parentSuspense, true); + } + function pruneCache(filter2) { + cache.forEach((vnode, key) => { + const name = getComponentName(vnode.type); + if (name && (!filter2 || !filter2(name))) { + pruneCacheEntry(key); + } + }); + } + function pruneCacheEntry(key) { + const cached = cache.get(key); + if (!current || !isSameVNodeType(cached, current)) { + unmount(cached); + } else if (current) { + resetShapeFlag(current); + } + cache.delete(key); + keys.delete(key); + } + watch( + () => [props.include, props.exclude], + ([include, exclude]) => { + include && pruneCache((name) => matches$1(include, name)); + exclude && pruneCache((name) => !matches$1(exclude, name)); + }, + // prune post-render after `current` has been updated + { flush: "post", deep: true } + ); + let pendingCacheKey = null; + const cacheSubtree = () => { + if (pendingCacheKey != null) { + cache.set(pendingCacheKey, getInnerChild(instance.subTree)); + } + }; + onMounted(cacheSubtree); + onUpdated(cacheSubtree); + onBeforeUnmount(() => { + cache.forEach((cached) => { + const { subTree, suspense } = instance; + const vnode = getInnerChild(subTree); + if (cached.type === vnode.type && cached.key === vnode.key) { + resetShapeFlag(vnode); + const da = vnode.component.da; + da && queuePostRenderEffect(da, suspense); + return; + } + unmount(cached); + }); + }); + return () => { + pendingCacheKey = null; + if (!slots.default) { + return null; + } + const children = slots.default(); + const rawVNode = children[0]; + if (children.length > 1) { + current = null; + return children; + } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) { + current = null; + return rawVNode; + } + let vnode = getInnerChild(rawVNode); + const comp = vnode.type; + const name = getComponentName( + isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp + ); + const { include, exclude, max } = props; + if (include && (!name || !matches$1(include, name)) || exclude && name && matches$1(exclude, name)) { + current = vnode; + return rawVNode; + } + const key = vnode.key == null ? comp : vnode.key; + const cachedVNode = cache.get(key); + if (vnode.el) { + vnode = cloneVNode(vnode); + if (rawVNode.shapeFlag & 128) { + rawVNode.ssContent = vnode; + } + } + pendingCacheKey = key; + if (cachedVNode) { + vnode.el = cachedVNode.el; + vnode.component = cachedVNode.component; + if (vnode.transition) { + setTransitionHooks(vnode, vnode.transition); + } + vnode.shapeFlag |= 512; + keys.delete(key); + keys.add(key); + } else { + keys.add(key); + if (max && keys.size > parseInt(max, 10)) { + pruneCacheEntry(keys.values().next().value); + } + } + vnode.shapeFlag |= 256; + current = vnode; + return isSuspense(rawVNode.type) ? rawVNode : vnode; + }; + } +}; +const KeepAlive = KeepAliveImpl; +function matches$1(pattern, name) { + if (isArray$1(pattern)) { + return pattern.some((p2) => matches$1(p2, name)); + } else if (isString$1(pattern)) { + return pattern.split(",").includes(name); + } else if (isRegExp$1(pattern)) { + return pattern.test(name); + } + return false; +} +function onActivated(hook, target) { + registerKeepAliveHook(hook, "a", target); +} +function onDeactivated(hook, target) { + registerKeepAliveHook(hook, "da", target); +} +function registerKeepAliveHook(hook, type, target = currentInstance) { + const wrappedHook = hook.__wdc || (hook.__wdc = () => { + let current = target; + while (current) { + if (current.isDeactivated) { + return; + } + current = current.parent; + } + return hook(); + }); + injectHook(type, wrappedHook, target); + if (target) { + let current = target.parent; + while (current && current.parent) { + if (isKeepAlive(current.parent.vnode)) { + injectToKeepAliveRoot(wrappedHook, type, target, current); + } + current = current.parent; + } + } +} +function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { + const injected = injectHook( + type, + hook, + keepAliveRoot, + true + /* prepend */ + ); + onUnmounted(() => { + remove(keepAliveRoot[type], injected); + }, target); +} +function resetShapeFlag(vnode) { + vnode.shapeFlag &= ~256; + vnode.shapeFlag &= ~512; +} +function getInnerChild(vnode) { + return vnode.shapeFlag & 128 ? vnode.ssContent : vnode; +} +function injectHook(type, hook, target = currentInstance, prepend = false) { + if (target) { + const hooks8 = target[type] || (target[type] = []); + const wrappedHook = hook.__weh || (hook.__weh = (...args) => { + if (target.isUnmounted) { + return; + } + pauseTracking(); + const reset2 = setCurrentInstance(target); + const res = callWithAsyncErrorHandling(hook, target, type, args); + reset2(); + resetTracking(); + return res; + }); + if (prepend) { + hooks8.unshift(wrappedHook); + } else { + hooks8.push(wrappedHook); + } + return wrappedHook; + } +} +const createHook = (lifecycle) => (hook, target = currentInstance) => ( + // post-create lifecycle registrations are noops during SSR (except for serverPrefetch) + (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target) +); +const onBeforeMount = createHook("bm"); +const onMounted = createHook("m"); +const onBeforeUpdate = createHook("bu"); +const onUpdated = createHook("u"); +const onBeforeUnmount = createHook("bum"); +const onUnmounted = createHook("um"); +const onServerPrefetch = createHook("sp"); +const onRenderTriggered = createHook( + "rtg" +); +const onRenderTracked = createHook( + "rtc" +); +function onErrorCaptured(hook, target = currentInstance) { + injectHook("ec", hook, target); +} +function renderList(source, renderItem, cache, index) { + let ret; + const cached = cache && cache[index]; + if (isArray$1(source) || isString$1(source)) { + ret = new Array(source.length); + for (let i = 0, l = source.length; i < l; i++) { + ret[i] = renderItem(source[i], i, void 0, cached && cached[i]); + } + } else if (typeof source === "number") { + ret = new Array(source); + for (let i = 0; i < source; i++) { + ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]); + } + } else if (isObject$6(source)) { + if (source[Symbol.iterator]) { + ret = Array.from( + source, + (item, i) => renderItem(item, i, void 0, cached && cached[i]) + ); + } else { + const keys = Object.keys(source); + ret = new Array(keys.length); + for (let i = 0, l = keys.length; i < l; i++) { + const key = keys[i]; + ret[i] = renderItem(source[key], key, i, cached && cached[i]); + } + } + } else { + ret = []; + } + if (cache) { + cache[index] = ret; + } + return ret; +} +function createSlots(slots, dynamicSlots) { + for (let i = 0; i < dynamicSlots.length; i++) { + const slot = dynamicSlots[i]; + if (isArray$1(slot)) { + for (let j2 = 0; j2 < slot.length; j2++) { + slots[slot[j2].name] = slot[j2].fn; + } + } else if (slot) { + slots[slot.name] = slot.key ? (...args) => { + const res = slot.fn(...args); + if (res) + res.key = slot.key; + return res; + } : slot.fn; + } + } + return slots; +} +function renderSlot(slots, name, props = {}, fallback, noSlotted) { + if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) { + if (name !== "default") + props.name = name; + return createVNode("slot", props, fallback && fallback()); + } + let slot = slots[name]; + if (slot && slot._c) { + slot._d = false; + } + openBlock(); + const validSlotContent = slot && ensureValidVNode(slot(props)); + const rendered = createBlock( + Fragment, + { + key: props.key || // slot content array of a dynamic conditional slot may have a branch + // key attached in the `createSlots` helper, respect that + validSlotContent && validSlotContent.key || `_${name}` + }, + validSlotContent || (fallback ? fallback() : []), + validSlotContent && slots._ === 1 ? 64 : -2 + ); + if (!noSlotted && rendered.scopeId) { + rendered.slotScopeIds = [rendered.scopeId + "-s"]; + } + if (slot && slot._c) { + slot._d = true; + } + return rendered; +} +function ensureValidVNode(vnodes) { + return vnodes.some((child) => { + if (!isVNode(child)) + return true; + if (child.type === Comment) + return false; + if (child.type === Fragment && !ensureValidVNode(child.children)) + return false; + return true; + }) ? vnodes : null; +} +function toHandlers(obj, preserveCaseIfNecessary) { + const ret = {}; + for (const key in obj) { + ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key]; + } + return ret; +} +const getPublicInstance = (i) => { + if (!i) + return null; + if (isStatefulComponent(i)) + return getExposeProxy(i) || i.proxy; + return getPublicInstance(i.parent); +}; +const publicPropertiesMap = ( + // Move PURE marker to new line to workaround compiler discarding it + // due to type annotation + /* @__PURE__ */ extend$1(/* @__PURE__ */ Object.create(null), { + $: (i) => i, + $el: (i) => i.vnode.el, + $data: (i) => i.data, + $props: (i) => i.props, + $attrs: (i) => i.attrs, + $slots: (i) => i.slots, + $refs: (i) => i.refs, + $parent: (i) => getPublicInstance(i.parent), + $root: (i) => getPublicInstance(i.root), + $emit: (i) => i.emit, + $options: (i) => resolveMergedOptions(i), + $forceUpdate: (i) => i.f || (i.f = () => { + i.effect.dirty = true; + queueJob(i.update); + }), + $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), + $watch: (i) => instanceWatch.bind(i) + }) +); +const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); +const PublicInstanceProxyHandlers = { + get({ _: instance }, key) { + const { ctx, setupState, data, props, accessCache, type, appContext } = instance; + let normalizedProps; + if (key[0] !== "$") { + const n = accessCache[key]; + if (n !== void 0) { + switch (n) { + case 1: + return setupState[key]; + case 2: + return data[key]; + case 4: + return ctx[key]; + case 3: + return props[key]; + } + } else if (hasSetupBinding(setupState, key)) { + accessCache[key] = 1; + return setupState[key]; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + accessCache[key] = 2; + return data[key]; + } else if ( + // only cache other properties when instance has declared (thus stable) + // props + (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) + ) { + accessCache[key] = 3; + return props[key]; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if (shouldCacheAccess) { + accessCache[key] = 0; + } + } + const publicGetter = publicPropertiesMap[key]; + let cssModule, globalProperties; + if (publicGetter) { + if (key === "$attrs") { + track(instance, "get", key); + } + return publicGetter(instance); + } else if ( + // css module (injected by vue-loader) + (cssModule = type.__cssModules) && (cssModule = cssModule[key]) + ) { + return cssModule; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if ( + // global properties + globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) + ) { + { + return globalProperties[key]; + } + } else + ; + }, + set({ _: instance }, key, value) { + const { data, setupState, ctx } = instance; + if (hasSetupBinding(setupState, key)) { + setupState[key] = value; + return true; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + data[key] = value; + return true; + } else if (hasOwn(instance.props, key)) { + return false; + } + if (key[0] === "$" && key.slice(1) in instance) { + return false; + } else { + { + ctx[key] = value; + } + } + return true; + }, + has({ + _: { data, setupState, accessCache, ctx, appContext, propsOptions } + }, key) { + let normalizedProps; + return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key); + }, + defineProperty(target, key, descriptor) { + if (descriptor.get != null) { + target._.accessCache[key] = 0; + } else if (hasOwn(descriptor, "value")) { + this.set(target, key, descriptor.value, null); + } + return Reflect.defineProperty(target, key, descriptor); + } +}; +const RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend$1( + {}, + PublicInstanceProxyHandlers, + { + get(target, key) { + if (key === Symbol.unscopables) { + return; + } + return PublicInstanceProxyHandlers.get(target, key, target); + }, + has(_, key) { + const has2 = key[0] !== "_" && !isGloballyAllowed(key); + return has2; + } + } +); +function defineProps() { + return null; +} +function defineEmits() { + return null; +} +function defineExpose(exposed) { +} +function defineOptions(options) { +} +function defineSlots() { + return null; +} +function defineModel() { +} +function withDefaults(props, defaults2) { + return null; +} +function useSlots() { + return getContext().slots; +} +function useAttrs() { + return getContext().attrs; +} +function getContext() { + const i = getCurrentInstance(); + return i.setupContext || (i.setupContext = createSetupContext(i)); +} +function normalizePropsOrEmits(props) { + return isArray$1(props) ? props.reduce( + (normalized, p2) => (normalized[p2] = null, normalized), + {} + ) : props; +} +function mergeDefaults(raw, defaults2) { + const props = normalizePropsOrEmits(raw); + for (const key in defaults2) { + if (key.startsWith("__skip")) + continue; + let opt = props[key]; + if (opt) { + if (isArray$1(opt) || isFunction$1(opt)) { + opt = props[key] = { type: opt, default: defaults2[key] }; + } else { + opt.default = defaults2[key]; + } + } else if (opt === null) { + opt = props[key] = { default: defaults2[key] }; + } else + ; + if (opt && defaults2[`__skip_${key}`]) { + opt.skipFactory = true; + } + } + return props; +} +function mergeModels(a, b) { + if (!a || !b) + return a || b; + if (isArray$1(a) && isArray$1(b)) + return a.concat(b); + return extend$1({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b)); +} +function createPropsRestProxy(props, excludedKeys) { + const ret = {}; + for (const key in props) { + if (!excludedKeys.includes(key)) { + Object.defineProperty(ret, key, { + enumerable: true, + get: () => props[key] + }); + } + } + return ret; +} +function withAsyncContext(getAwaitable) { + const ctx = getCurrentInstance(); + let awaitable = getAwaitable(); + unsetCurrentInstance(); + if (isPromise(awaitable)) { + awaitable = awaitable.catch((e) => { + setCurrentInstance(ctx); + throw e; + }); + } + return [awaitable, () => setCurrentInstance(ctx)]; +} +let shouldCacheAccess = true; +function applyOptions(instance) { + const options = resolveMergedOptions(instance); + const publicThis = instance.proxy; + const ctx = instance.ctx; + shouldCacheAccess = false; + if (options.beforeCreate) { + callHook$1(options.beforeCreate, instance, "bc"); + } + const { + // state + data: dataOptions, + computed: computedOptions, + methods, + watch: watchOptions, + provide: provideOptions, + inject: injectOptions, + // lifecycle + created, + beforeMount, + mounted, + beforeUpdate, + updated, + activated, + deactivated, + beforeDestroy, + beforeUnmount, + destroyed, + unmounted, + render: render3, + renderTracked, + renderTriggered, + errorCaptured, + serverPrefetch, + // public API + expose, + inheritAttrs, + // assets + components, + directives, + filters + } = options; + const checkDuplicateProperties = null; + if (injectOptions) { + resolveInjections(injectOptions, ctx, checkDuplicateProperties); + } + if (methods) { + for (const key in methods) { + const methodHandler = methods[key]; + if (isFunction$1(methodHandler)) { + { + ctx[key] = methodHandler.bind(publicThis); + } + } + } + } + if (dataOptions) { + const data = dataOptions.call(publicThis, publicThis); + if (!isObject$6(data)) + ; + else { + instance.data = reactive(data); + } + } + shouldCacheAccess = true; + if (computedOptions) { + for (const key in computedOptions) { + const opt = computedOptions[key]; + const get3 = isFunction$1(opt) ? opt.bind(publicThis, publicThis) : isFunction$1(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP; + const set3 = !isFunction$1(opt) && isFunction$1(opt.set) ? opt.set.bind(publicThis) : NOOP; + const c = computed({ + get: get3, + set: set3 + }); + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => c.value, + set: (v) => c.value = v + }); + } + } + if (watchOptions) { + for (const key in watchOptions) { + createWatcher(watchOptions[key], ctx, publicThis, key); + } + } + if (provideOptions) { + const provides7 = isFunction$1(provideOptions) ? provideOptions.call(publicThis) : provideOptions; + Reflect.ownKeys(provides7).forEach((key) => { + provide(key, provides7[key]); + }); + } + if (created) { + callHook$1(created, instance, "c"); + } + function registerLifecycleHook(register, hook) { + if (isArray$1(hook)) { + hook.forEach((_hook) => register(_hook.bind(publicThis))); + } else if (hook) { + register(hook.bind(publicThis)); + } + } + registerLifecycleHook(onBeforeMount, beforeMount); + registerLifecycleHook(onMounted, mounted); + registerLifecycleHook(onBeforeUpdate, beforeUpdate); + registerLifecycleHook(onUpdated, updated); + registerLifecycleHook(onActivated, activated); + registerLifecycleHook(onDeactivated, deactivated); + registerLifecycleHook(onErrorCaptured, errorCaptured); + registerLifecycleHook(onRenderTracked, renderTracked); + registerLifecycleHook(onRenderTriggered, renderTriggered); + registerLifecycleHook(onBeforeUnmount, beforeUnmount); + registerLifecycleHook(onUnmounted, unmounted); + registerLifecycleHook(onServerPrefetch, serverPrefetch); + if (isArray$1(expose)) { + if (expose.length) { + const exposed = instance.exposed || (instance.exposed = {}); + expose.forEach((key) => { + Object.defineProperty(exposed, key, { + get: () => publicThis[key], + set: (val) => publicThis[key] = val + }); + }); + } else if (!instance.exposed) { + instance.exposed = {}; + } + } + if (render3 && instance.render === NOOP) { + instance.render = render3; + } + if (inheritAttrs != null) { + instance.inheritAttrs = inheritAttrs; + } + if (components) + instance.components = components; + if (directives) + instance.directives = directives; +} +function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) { + if (isArray$1(injectOptions)) { + injectOptions = normalizeInject(injectOptions); + } + for (const key in injectOptions) { + const opt = injectOptions[key]; + let injected; + if (isObject$6(opt)) { + if ("default" in opt) { + injected = inject( + opt.from || key, + opt.default, + true + ); + } else { + injected = inject(opt.from || key); + } + } else { + injected = inject(opt); + } + if (isRef(injected)) { + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => injected.value, + set: (v) => injected.value = v + }); + } else { + ctx[key] = injected; + } + } +} +function callHook$1(hook, instance, type) { + callWithAsyncErrorHandling( + isArray$1(hook) ? hook.map((h2) => h2.bind(instance.proxy)) : hook.bind(instance.proxy), + instance, + type + ); +} +function createWatcher(raw, ctx, publicThis, key) { + const getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key]; + if (isString$1(raw)) { + const handler = ctx[raw]; + if (isFunction$1(handler)) { + watch(getter, handler); + } + } else if (isFunction$1(raw)) { + watch(getter, raw.bind(publicThis)); + } else if (isObject$6(raw)) { + if (isArray$1(raw)) { + raw.forEach((r) => createWatcher(r, ctx, publicThis, key)); + } else { + const handler = isFunction$1(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler]; + if (isFunction$1(handler)) { + watch(getter, handler, raw); + } + } + } else + ; +} +function resolveMergedOptions(instance) { + const base = instance.type; + const { mixins, extends: extendsOptions } = base; + const { + mixins: globalMixins, + optionsCache: cache, + config: { optionMergeStrategies } + } = instance.appContext; + const cached = cache.get(base); + let resolved; + if (cached) { + resolved = cached; + } else if (!globalMixins.length && !mixins && !extendsOptions) { + { + resolved = base; + } + } else { + resolved = {}; + if (globalMixins.length) { + globalMixins.forEach( + (m) => mergeOptions(resolved, m, optionMergeStrategies, true) + ); + } + mergeOptions(resolved, base, optionMergeStrategies); + } + if (isObject$6(base)) { + cache.set(base, resolved); + } + return resolved; +} +function mergeOptions(to, from, strats, asMixin = false) { + const { mixins, extends: extendsOptions } = from; + if (extendsOptions) { + mergeOptions(to, extendsOptions, strats, true); + } + if (mixins) { + mixins.forEach( + (m) => mergeOptions(to, m, strats, true) + ); + } + for (const key in from) { + if (asMixin && key === "expose") + ; + else { + const strat = internalOptionMergeStrats[key] || strats && strats[key]; + to[key] = strat ? strat(to[key], from[key]) : from[key]; + } + } + return to; +} +const internalOptionMergeStrats = { + data: mergeDataFn, + props: mergeEmitsOrPropsOptions, + emits: mergeEmitsOrPropsOptions, + // objects + methods: mergeObjectOptions, + computed: mergeObjectOptions, + // lifecycle + beforeCreate: mergeAsArray$1, + created: mergeAsArray$1, + beforeMount: mergeAsArray$1, + mounted: mergeAsArray$1, + beforeUpdate: mergeAsArray$1, + updated: mergeAsArray$1, + beforeDestroy: mergeAsArray$1, + beforeUnmount: mergeAsArray$1, + destroyed: mergeAsArray$1, + unmounted: mergeAsArray$1, + activated: mergeAsArray$1, + deactivated: mergeAsArray$1, + errorCaptured: mergeAsArray$1, + serverPrefetch: mergeAsArray$1, + // assets + components: mergeObjectOptions, + directives: mergeObjectOptions, + // watch + watch: mergeWatchOptions, + // provide / inject + provide: mergeDataFn, + inject: mergeInject +}; +function mergeDataFn(to, from) { + if (!from) { + return to; + } + if (!to) { + return from; + } + return function mergedDataFn() { + return extend$1( + isFunction$1(to) ? to.call(this, this) : to, + isFunction$1(from) ? from.call(this, this) : from + ); + }; +} +function mergeInject(to, from) { + return mergeObjectOptions(normalizeInject(to), normalizeInject(from)); +} +function normalizeInject(raw) { + if (isArray$1(raw)) { + const res = {}; + for (let i = 0; i < raw.length; i++) { + res[raw[i]] = raw[i]; + } + return res; + } + return raw; +} +function mergeAsArray$1(to, from) { + return to ? [...new Set([].concat(to, from))] : from; +} +function mergeObjectOptions(to, from) { + return to ? extend$1(/* @__PURE__ */ Object.create(null), to, from) : from; +} +function mergeEmitsOrPropsOptions(to, from) { + if (to) { + if (isArray$1(to) && isArray$1(from)) { + return [.../* @__PURE__ */ new Set([...to, ...from])]; + } + return extend$1( + /* @__PURE__ */ Object.create(null), + normalizePropsOrEmits(to), + normalizePropsOrEmits(from != null ? from : {}) + ); + } else { + return from; + } +} +function mergeWatchOptions(to, from) { + if (!to) + return from; + if (!from) + return to; + const merged = extend$1(/* @__PURE__ */ Object.create(null), to); + for (const key in from) { + merged[key] = mergeAsArray$1(to[key], from[key]); + } + return merged; +} +function createAppContext() { + return { + app: null, + config: { + isNativeTag: NO, + performance: false, + globalProperties: {}, + optionMergeStrategies: {}, + errorHandler: void 0, + warnHandler: void 0, + compilerOptions: {} + }, + mixins: [], + components: {}, + directives: {}, + provides: /* @__PURE__ */ Object.create(null), + optionsCache: /* @__PURE__ */ new WeakMap(), + propsCache: /* @__PURE__ */ new WeakMap(), + emitsCache: /* @__PURE__ */ new WeakMap() + }; +} +let uid$1 = 0; +function createAppAPI(render3, hydrate2) { + return function createApp2(rootComponent, rootProps = null) { + if (!isFunction$1(rootComponent)) { + rootComponent = extend$1({}, rootComponent); + } + if (rootProps != null && !isObject$6(rootProps)) { + rootProps = null; + } + const context = createAppContext(); + const installedPlugins = /* @__PURE__ */ new WeakSet(); + let isMounted = false; + const app2 = context.app = { + _uid: uid$1++, + _component: rootComponent, + _props: rootProps, + _container: null, + _context: context, + _instance: null, + version, + get config() { + return context.config; + }, + set config(v) { + }, + use(plugin, ...options) { + if (installedPlugins.has(plugin)) + ; + else if (plugin && isFunction$1(plugin.install)) { + installedPlugins.add(plugin); + plugin.install(app2, ...options); + } else if (isFunction$1(plugin)) { + installedPlugins.add(plugin); + plugin(app2, ...options); + } else + ; + return app2; + }, + mixin(mixin) { + { + if (!context.mixins.includes(mixin)) { + context.mixins.push(mixin); + } + } + return app2; + }, + component(name, component) { + if (!component) { + return context.components[name]; + } + context.components[name] = component; + return app2; + }, + directive(name, directive) { + if (!directive) { + return context.directives[name]; + } + context.directives[name] = directive; + return app2; + }, + mount(rootContainer, isHydrate, namespace2) { + if (!isMounted) { + const vnode = createVNode(rootComponent, rootProps); + vnode.appContext = context; + if (namespace2 === true) { + namespace2 = "svg"; + } else if (namespace2 === false) { + namespace2 = void 0; + } + if (isHydrate && hydrate2) { + hydrate2(vnode, rootContainer); + } else { + render3(vnode, rootContainer, namespace2); + } + isMounted = true; + app2._container = rootContainer; + rootContainer.__vue_app__ = app2; + return getExposeProxy(vnode.component) || vnode.component.proxy; + } + }, + unmount() { + if (isMounted) { + render3(null, app2._container); + delete app2._container.__vue_app__; + } + }, + provide(key, value) { + context.provides[key] = value; + return app2; + }, + runWithContext(fn) { + const lastApp = currentApp; + currentApp = app2; + try { + return fn(); + } finally { + currentApp = lastApp; + } + } + }; + return app2; + }; +} +let currentApp = null; +function provide(key, value) { + if (!currentInstance) + ; + else { + let provides7 = currentInstance.provides; + const parentProvides = currentInstance.parent && currentInstance.parent.provides; + if (parentProvides === provides7) { + provides7 = currentInstance.provides = Object.create(parentProvides); + } + provides7[key] = value; + } +} +function inject(key, defaultValue, treatDefaultAsFactory = false) { + const instance = currentInstance || currentRenderingInstance; + if (instance || currentApp) { + const provides7 = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides; + if (provides7 && key in provides7) { + return provides7[key]; + } else if (arguments.length > 1) { + return treatDefaultAsFactory && isFunction$1(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue; + } else + ; + } +} +function hasInjectionContext() { + return !!(currentInstance || currentRenderingInstance || currentApp); +} +function initProps(instance, rawProps, isStateful, isSSR = false) { + const props = {}; + const attrs = {}; + def(attrs, InternalObjectKey, 1); + instance.propsDefaults = /* @__PURE__ */ Object.create(null); + setFullProps(instance, rawProps, props, attrs); + for (const key in instance.propsOptions[0]) { + if (!(key in props)) { + props[key] = void 0; + } + } + if (isStateful) { + instance.props = isSSR ? props : shallowReactive(props); + } else { + if (!instance.type.props) { + instance.props = attrs; + } else { + instance.props = props; + } + } + instance.attrs = attrs; +} +function updateProps(instance, rawProps, rawPrevProps, optimized) { + const { + props, + attrs, + vnode: { patchFlag } + } = instance; + const rawCurrentProps = toRaw(props); + const [options] = instance.propsOptions; + let hasAttrsChanged = false; + if ( + // always force full diff in dev + // - #1942 if hmr is enabled with sfc component + // - vite#872 non-sfc component used by sfc component + (optimized || patchFlag > 0) && !(patchFlag & 16) + ) { + if (patchFlag & 8) { + const propsToUpdate = instance.vnode.dynamicProps; + for (let i = 0; i < propsToUpdate.length; i++) { + let key = propsToUpdate[i]; + if (isEmitListener(instance.emitsOptions, key)) { + continue; + } + const value = rawProps[key]; + if (options) { + if (hasOwn(attrs, key)) { + if (value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } else { + const camelizedKey = camelize(key); + props[camelizedKey] = resolvePropValue( + options, + rawCurrentProps, + camelizedKey, + value, + instance, + false + ); + } + } else { + if (value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } + } + } + } else { + if (setFullProps(instance, rawProps, props, attrs)) { + hasAttrsChanged = true; + } + let kebabKey; + for (const key in rawCurrentProps) { + if (!rawProps || // for camelCase + !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case + // and converted to camelCase (#955) + ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) { + if (options) { + if (rawPrevProps && // for camelCase + (rawPrevProps[key] !== void 0 || // for kebab-case + rawPrevProps[kebabKey] !== void 0)) { + props[key] = resolvePropValue( + options, + rawCurrentProps, + key, + void 0, + instance, + true + ); + } + } else { + delete props[key]; + } + } + } + if (attrs !== rawCurrentProps) { + for (const key in attrs) { + if (!rawProps || !hasOwn(rawProps, key) && true) { + delete attrs[key]; + hasAttrsChanged = true; + } + } + } + } + if (hasAttrsChanged) { + trigger(instance, "set", "$attrs"); + } +} +function setFullProps(instance, rawProps, props, attrs) { + const [options, needCastKeys] = instance.propsOptions; + let hasAttrsChanged = false; + let rawCastValues; + if (rawProps) { + for (let key in rawProps) { + if (isReservedProp(key)) { + continue; + } + const value = rawProps[key]; + let camelKey; + if (options && hasOwn(options, camelKey = camelize(key))) { + if (!needCastKeys || !needCastKeys.includes(camelKey)) { + props[camelKey] = value; + } else { + (rawCastValues || (rawCastValues = {}))[camelKey] = value; + } + } else if (!isEmitListener(instance.emitsOptions, key)) { + if (!(key in attrs) || value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } + } + } + if (needCastKeys) { + const rawCurrentProps = toRaw(props); + const castValues = rawCastValues || EMPTY_OBJ; + for (let i = 0; i < needCastKeys.length; i++) { + const key = needCastKeys[i]; + props[key] = resolvePropValue( + options, + rawCurrentProps, + key, + castValues[key], + instance, + !hasOwn(castValues, key) + ); + } + } + return hasAttrsChanged; +} +function resolvePropValue(options, props, key, value, instance, isAbsent) { + const opt = options[key]; + if (opt != null) { + const hasDefault = hasOwn(opt, "default"); + if (hasDefault && value === void 0) { + const defaultValue = opt.default; + if (opt.type !== Function && !opt.skipFactory && isFunction$1(defaultValue)) { + const { propsDefaults } = instance; + if (key in propsDefaults) { + value = propsDefaults[key]; + } else { + const reset2 = setCurrentInstance(instance); + value = propsDefaults[key] = defaultValue.call( + null, + props + ); + reset2(); + } + } else { + value = defaultValue; + } + } + if (opt[ + 0 + /* shouldCast */ + ]) { + if (isAbsent && !hasDefault) { + value = false; + } else if (opt[ + 1 + /* shouldCastTrue */ + ] && (value === "" || value === hyphenate(key))) { + value = true; + } + } + } + return value; +} +function normalizePropsOptions(comp, appContext, asMixin = false) { + const cache = appContext.propsCache; + const cached = cache.get(comp); + if (cached) { + return cached; + } + const raw = comp.props; + const normalized = {}; + const needCastKeys = []; + let hasExtends = false; + if (!isFunction$1(comp)) { + const extendProps = (raw2) => { + hasExtends = true; + const [props, keys] = normalizePropsOptions(raw2, appContext, true); + extend$1(normalized, props); + if (keys) + needCastKeys.push(...keys); + }; + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendProps); + } + if (comp.extends) { + extendProps(comp.extends); + } + if (comp.mixins) { + comp.mixins.forEach(extendProps); + } + } + if (!raw && !hasExtends) { + if (isObject$6(comp)) { + cache.set(comp, EMPTY_ARR); + } + return EMPTY_ARR; + } + if (isArray$1(raw)) { + for (let i = 0; i < raw.length; i++) { + const normalizedKey = camelize(raw[i]); + if (validatePropName(normalizedKey)) { + normalized[normalizedKey] = EMPTY_OBJ; + } + } + } else if (raw) { + for (const key in raw) { + const normalizedKey = camelize(key); + if (validatePropName(normalizedKey)) { + const opt = raw[key]; + const prop = normalized[normalizedKey] = isArray$1(opt) || isFunction$1(opt) ? { type: opt } : extend$1({}, opt); + if (prop) { + const booleanIndex = getTypeIndex(Boolean, prop.type); + const stringIndex = getTypeIndex(String, prop.type); + prop[ + 0 + /* shouldCast */ + ] = booleanIndex > -1; + prop[ + 1 + /* shouldCastTrue */ + ] = stringIndex < 0 || booleanIndex < stringIndex; + if (booleanIndex > -1 || hasOwn(prop, "default")) { + needCastKeys.push(normalizedKey); + } + } + } + } + } + const res = [normalized, needCastKeys]; + if (isObject$6(comp)) { + cache.set(comp, res); + } + return res; +} +function validatePropName(key) { + if (key[0] !== "$" && !isReservedProp(key)) { + return true; + } + return false; +} +function getType(ctor) { + if (ctor === null) { + return "null"; + } + if (typeof ctor === "function") { + return ctor.name || ""; + } else if (typeof ctor === "object") { + const name = ctor.constructor && ctor.constructor.name; + return name || ""; + } + return ""; +} +function isSameType(a, b) { + return getType(a) === getType(b); +} +function getTypeIndex(type, expectedTypes) { + if (isArray$1(expectedTypes)) { + return expectedTypes.findIndex((t) => isSameType(t, type)); + } else if (isFunction$1(expectedTypes)) { + return isSameType(expectedTypes, type) ? 0 : -1; + } + return -1; +} +const isInternalKey = (key) => key[0] === "_" || key === "$stable"; +const normalizeSlotValue = (value) => isArray$1(value) ? value.map(normalizeVNode) : [normalizeVNode(value)]; +const normalizeSlot = (key, rawSlot, ctx) => { + if (rawSlot._n) { + return rawSlot; + } + const normalized = withCtx((...args) => { + if (false) + ; + return normalizeSlotValue(rawSlot(...args)); + }, ctx); + normalized._c = false; + return normalized; +}; +const normalizeObjectSlots = (rawSlots, slots, instance) => { + const ctx = rawSlots._ctx; + for (const key in rawSlots) { + if (isInternalKey(key)) + continue; + const value = rawSlots[key]; + if (isFunction$1(value)) { + slots[key] = normalizeSlot(key, value, ctx); + } else if (value != null) { + const normalized = normalizeSlotValue(value); + slots[key] = () => normalized; + } + } +}; +const normalizeVNodeSlots = (instance, children) => { + const normalized = normalizeSlotValue(children); + instance.slots.default = () => normalized; +}; +const initSlots = (instance, children) => { + if (instance.vnode.shapeFlag & 32) { + const type = children._; + if (type) { + instance.slots = toRaw(children); + def(children, "_", type); + } else { + normalizeObjectSlots( + children, + instance.slots = {} + ); + } + } else { + instance.slots = {}; + if (children) { + normalizeVNodeSlots(instance, children); + } + } + def(instance.slots, InternalObjectKey, 1); +}; +const updateSlots = (instance, children, optimized) => { + const { vnode, slots } = instance; + let needDeletionCheck = true; + let deletionComparisonTarget = EMPTY_OBJ; + if (vnode.shapeFlag & 32) { + const type = children._; + if (type) { + if (optimized && type === 1) { + needDeletionCheck = false; + } else { + extend$1(slots, children); + if (!optimized && type === 1) { + delete slots._; + } + } + } else { + needDeletionCheck = !children.$stable; + normalizeObjectSlots(children, slots); + } + deletionComparisonTarget = children; + } else if (children) { + normalizeVNodeSlots(instance, children); + deletionComparisonTarget = { default: 1 }; + } + if (needDeletionCheck) { + for (const key in slots) { + if (!isInternalKey(key) && deletionComparisonTarget[key] == null) { + delete slots[key]; + } + } + } +}; +function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { + if (isArray$1(rawRef)) { + rawRef.forEach( + (r, i) => setRef( + r, + oldRawRef && (isArray$1(oldRawRef) ? oldRawRef[i] : oldRawRef), + parentSuspense, + vnode, + isUnmount + ) + ); + return; + } + if (isAsyncWrapper(vnode) && !isUnmount) { + return; + } + const refValue = vnode.shapeFlag & 4 ? getExposeProxy(vnode.component) || vnode.component.proxy : vnode.el; + const value = isUnmount ? null : refValue; + const { i: owner, r: ref3 } = rawRef; + const oldRef = oldRawRef && oldRawRef.r; + const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs; + const setupState = owner.setupState; + if (oldRef != null && oldRef !== ref3) { + if (isString$1(oldRef)) { + refs[oldRef] = null; + if (hasOwn(setupState, oldRef)) { + setupState[oldRef] = null; + } + } else if (isRef(oldRef)) { + oldRef.value = null; + } + } + if (isFunction$1(ref3)) { + callWithErrorHandling(ref3, owner, 12, [value, refs]); + } else { + const _isString = isString$1(ref3); + const _isRef = isRef(ref3); + if (_isString || _isRef) { + const doSet = () => { + if (rawRef.f) { + const existing = _isString ? hasOwn(setupState, ref3) ? setupState[ref3] : refs[ref3] : ref3.value; + if (isUnmount) { + isArray$1(existing) && remove(existing, refValue); + } else { + if (!isArray$1(existing)) { + if (_isString) { + refs[ref3] = [refValue]; + if (hasOwn(setupState, ref3)) { + setupState[ref3] = refs[ref3]; + } + } else { + ref3.value = [refValue]; + if (rawRef.k) + refs[rawRef.k] = ref3.value; + } + } else if (!existing.includes(refValue)) { + existing.push(refValue); + } + } + } else if (_isString) { + refs[ref3] = value; + if (hasOwn(setupState, ref3)) { + setupState[ref3] = value; + } + } else if (_isRef) { + ref3.value = value; + if (rawRef.k) + refs[rawRef.k] = value; + } else + ; + }; + if (value) { + doSet.id = -1; + queuePostRenderEffect(doSet, parentSuspense); + } else { + doSet(); + } + } + } +} +let hasMismatch = false; +const isSVGContainer = (container) => container.namespaceURI.includes("svg") && container.tagName !== "foreignObject"; +const isMathMLContainer = (container) => container.namespaceURI.includes("MathML"); +const getContainerType = (container) => { + if (isSVGContainer(container)) + return "svg"; + if (isMathMLContainer(container)) + return "mathml"; + return void 0; +}; +const isComment = (node) => node.nodeType === 8; +function createHydrationFunctions(rendererInternals) { + const { + mt: mountComponent, + p: patch, + o: { + patchProp: patchProp2, + createText, + nextSibling, + parentNode, + remove: remove2, + insert, + createComment + } + } = rendererInternals; + const hydrate2 = (vnode, container) => { + if (!container.hasChildNodes()) { + patch(null, vnode, container); + flushPostFlushCbs(); + container._vnode = vnode; + return; + } + hasMismatch = false; + hydrateNode(container.firstChild, vnode, null, null, null); + flushPostFlushCbs(); + container._vnode = vnode; + if (hasMismatch && true) { + console.error(`Hydration completed but contains mismatches.`); + } + }; + const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => { + const isFragmentStart = isComment(node) && node.data === "["; + const onMismatch = () => handleMismatch( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + isFragmentStart + ); + const { type, ref: ref3, shapeFlag, patchFlag } = vnode; + let domType = node.nodeType; + vnode.el = node; + if (patchFlag === -2) { + optimized = false; + vnode.dynamicChildren = null; + } + let nextNode = null; + switch (type) { + case Text: + if (domType !== 3) { + if (vnode.children === "") { + insert(vnode.el = createText(""), parentNode(node), node); + nextNode = node; + } else { + nextNode = onMismatch(); + } + } else { + if (node.data !== vnode.children) { + hasMismatch = true; + node.data = vnode.children; + } + nextNode = nextSibling(node); + } + break; + case Comment: + if (isTemplateNode2(node)) { + nextNode = nextSibling(node); + replaceNode( + vnode.el = node.content.firstChild, + node, + parentComponent + ); + } else if (domType !== 8 || isFragmentStart) { + nextNode = onMismatch(); + } else { + nextNode = nextSibling(node); + } + break; + case Static: + if (isFragmentStart) { + node = nextSibling(node); + domType = node.nodeType; + } + if (domType === 1 || domType === 3) { + nextNode = node; + const needToAdoptContent = !vnode.children.length; + for (let i = 0; i < vnode.staticCount; i++) { + if (needToAdoptContent) + vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data; + if (i === vnode.staticCount - 1) { + vnode.anchor = nextNode; + } + nextNode = nextSibling(nextNode); + } + return isFragmentStart ? nextSibling(nextNode) : nextNode; + } else { + onMismatch(); + } + break; + case Fragment: + if (!isFragmentStart) { + nextNode = onMismatch(); + } else { + nextNode = hydrateFragment( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } + break; + default: + if (shapeFlag & 1) { + if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode2(node)) { + nextNode = onMismatch(); + } else { + nextNode = hydrateElement( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } + } else if (shapeFlag & 6) { + vnode.slotScopeIds = slotScopeIds; + const container = parentNode(node); + if (isFragmentStart) { + nextNode = locateClosingAnchor(node); + } else if (isComment(node) && node.data === "teleport start") { + nextNode = locateClosingAnchor(node, node.data, "teleport end"); + } else { + nextNode = nextSibling(node); + } + mountComponent( + vnode, + container, + null, + parentComponent, + parentSuspense, + getContainerType(container), + optimized + ); + if (isAsyncWrapper(vnode)) { + let subTree; + if (isFragmentStart) { + subTree = createVNode(Fragment); + subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild; + } else { + subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div"); + } + subTree.el = node; + vnode.component.subTree = subTree; + } + } else if (shapeFlag & 64) { + if (domType !== 8) { + nextNode = onMismatch(); + } else { + nextNode = vnode.type.hydrate( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized, + rendererInternals, + hydrateChildren + ); + } + } else if (shapeFlag & 128) { + nextNode = vnode.type.hydrate( + node, + vnode, + parentComponent, + parentSuspense, + getContainerType(parentNode(node)), + slotScopeIds, + optimized, + rendererInternals, + hydrateNode + ); + } else + ; + } + if (ref3 != null) { + setRef(ref3, null, parentSuspense, vnode); + } + return nextNode; + }; + const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { + optimized = optimized || !!vnode.dynamicChildren; + const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode; + const forcePatch = type === "input" || type === "option"; + if (forcePatch || patchFlag !== -1) { + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "created"); + } + let needCallTransitionHooks = false; + if (isTemplateNode2(el)) { + needCallTransitionHooks = needTransition(parentSuspense, transition) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear; + const content = el.content.firstChild; + if (needCallTransitionHooks) { + transition.beforeEnter(content); + } + replaceNode(content, el, parentComponent); + vnode.el = el = content; + } + if (shapeFlag & 16 && // skip if element has innerHTML / textContent + !(props && (props.innerHTML || props.textContent))) { + let next = hydrateChildren( + el.firstChild, + vnode, + el, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + while (next) { + hasMismatch = true; + const cur = next; + next = next.nextSibling; + remove2(cur); + } + } else if (shapeFlag & 8) { + if (el.textContent !== vnode.children) { + hasMismatch = true; + el.textContent = vnode.children; + } + } + if (props) { + if (forcePatch || !optimized || patchFlag & (16 | 32)) { + for (const key in props) { + if (forcePatch && (key.endsWith("value") || key === "indeterminate") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers + key[0] === ".") { + patchProp2( + el, + key, + null, + props[key], + void 0, + void 0, + parentComponent + ); + } + } + } else if (props.onClick) { + patchProp2( + el, + "onClick", + null, + props.onClick, + void 0, + void 0, + parentComponent + ); + } + } + let vnodeHooks; + if (vnodeHooks = props && props.onVnodeBeforeMount) { + invokeVNodeHook(vnodeHooks, parentComponent, vnode); + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); + } + if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) { + queueEffectWithSuspense(() => { + vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode); + needCallTransitionHooks && transition.enter(el); + dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); + }, parentSuspense); + } + } + return el.nextSibling; + }; + const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => { + optimized = optimized || !!parentVNode.dynamicChildren; + const children = parentVNode.children; + const l = children.length; + for (let i = 0; i < l; i++) { + const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]); + if (node) { + node = hydrateNode( + node, + vnode, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } else if (vnode.type === Text && !vnode.children) { + continue; + } else { + hasMismatch = true; + patch( + null, + vnode, + container, + null, + parentComponent, + parentSuspense, + getContainerType(container), + slotScopeIds + ); + } + } + return node; + }; + const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { + const { slotScopeIds: fragmentSlotScopeIds } = vnode; + if (fragmentSlotScopeIds) { + slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; + } + const container = parentNode(node); + const next = hydrateChildren( + nextSibling(node), + vnode, + container, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + if (next && isComment(next) && next.data === "]") { + return nextSibling(vnode.anchor = next); + } else { + hasMismatch = true; + insert(vnode.anchor = createComment(`]`), container, next); + return next; + } + }; + const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => { + hasMismatch = true; + vnode.el = null; + if (isFragment) { + const end3 = locateClosingAnchor(node); + while (true) { + const next2 = nextSibling(node); + if (next2 && next2 !== end3) { + remove2(next2); + } else { + break; + } + } + } + const next = nextSibling(node); + const container = parentNode(node); + remove2(node); + patch( + null, + vnode, + container, + next, + parentComponent, + parentSuspense, + getContainerType(container), + slotScopeIds + ); + return next; + }; + const locateClosingAnchor = (node, open = "[", close = "]") => { + let match2 = 0; + while (node) { + node = nextSibling(node); + if (node && isComment(node)) { + if (node.data === open) + match2++; + if (node.data === close) { + if (match2 === 0) { + return nextSibling(node); + } else { + match2--; + } + } + } + } + return node; + }; + const replaceNode = (newNode, oldNode, parentComponent) => { + const parentNode2 = oldNode.parentNode; + if (parentNode2) { + parentNode2.replaceChild(newNode, oldNode); + } + let parent = parentComponent; + while (parent) { + if (parent.vnode.el === oldNode) { + parent.vnode.el = parent.subTree.el = newNode; + } + parent = parent.parent; + } + }; + const isTemplateNode2 = (node) => { + return node.nodeType === 1 && node.tagName.toLowerCase() === "template"; + }; + return [hydrate2, hydrateNode]; +} +const queuePostRenderEffect = queueEffectWithSuspense; +function createRenderer(options) { + return baseCreateRenderer(options); +} +function createHydrationRenderer(options) { + return baseCreateRenderer(options, createHydrationFunctions); +} +function baseCreateRenderer(options, createHydrationFns) { + const target = getGlobalThis(); + target.__VUE__ = true; + const { + insert: hostInsert, + remove: hostRemove, + patchProp: hostPatchProp, + createElement: hostCreateElement, + createText: hostCreateText, + createComment: hostCreateComment, + setText: hostSetText, + setElementText: hostSetElementText, + parentNode: hostParentNode, + nextSibling: hostNextSibling, + setScopeId: hostSetScopeId = NOOP, + insertStaticContent: hostInsertStaticContent + } = options; + const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace2 = void 0, slotScopeIds = null, optimized = !!n2.dynamicChildren) => { + if (n1 === n2) { + return; + } + if (n1 && !isSameVNodeType(n1, n2)) { + anchor = getNextHostNode(n1); + unmount(n1, parentComponent, parentSuspense, true); + n1 = null; + } + if (n2.patchFlag === -2) { + optimized = false; + n2.dynamicChildren = null; + } + const { type, ref: ref3, shapeFlag } = n2; + switch (type) { + case Text: + processText(n1, n2, container, anchor); + break; + case Comment: + processCommentNode(n1, n2, container, anchor); + break; + case Static: + if (n1 == null) { + mountStaticNode(n2, container, anchor, namespace2); + } + break; + case Fragment: + processFragment( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized + ); + break; + default: + if (shapeFlag & 1) { + processElement( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized + ); + } else if (shapeFlag & 6) { + processComponent( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized + ); + } else if (shapeFlag & 64) { + type.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized, + internals + ); + } else if (shapeFlag & 128) { + type.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized, + internals + ); + } else + ; + } + if (ref3 != null && parentComponent) { + setRef(ref3, n1 && n1.ref, parentSuspense, n2 || n1, !n2); + } + }; + const processText = (n1, n2, container, anchor) => { + if (n1 == null) { + hostInsert( + n2.el = hostCreateText(n2.children), + container, + anchor + ); + } else { + const el = n2.el = n1.el; + if (n2.children !== n1.children) { + hostSetText(el, n2.children); + } + } + }; + const processCommentNode = (n1, n2, container, anchor) => { + if (n1 == null) { + hostInsert( + n2.el = hostCreateComment(n2.children || ""), + container, + anchor + ); + } else { + n2.el = n1.el; + } + }; + const mountStaticNode = (n2, container, anchor, namespace2) => { + [n2.el, n2.anchor] = hostInsertStaticContent( + n2.children, + container, + anchor, + namespace2, + n2.el, + n2.anchor + ); + }; + const moveStaticNode = ({ el, anchor }, container, nextSibling) => { + let next; + while (el && el !== anchor) { + next = hostNextSibling(el); + hostInsert(el, container, nextSibling); + el = next; + } + hostInsert(anchor, container, nextSibling); + }; + const removeStaticNode = ({ el, anchor }) => { + let next; + while (el && el !== anchor) { + next = hostNextSibling(el); + hostRemove(el); + el = next; + } + hostRemove(anchor); + }; + const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace2, slotScopeIds, optimized) => { + if (n2.type === "svg") { + namespace2 = "svg"; + } else if (n2.type === "math") { + namespace2 = "mathml"; + } + if (n1 == null) { + mountElement( + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized + ); + } else { + patchElement( + n1, + n2, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized + ); + } + }; + const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace2, slotScopeIds, optimized) => { + let el; + let vnodeHook; + const { props, shapeFlag, transition, dirs } = vnode; + el = vnode.el = hostCreateElement( + vnode.type, + namespace2, + props && props.is, + props + ); + if (shapeFlag & 8) { + hostSetElementText(el, vnode.children); + } else if (shapeFlag & 16) { + mountChildren( + vnode.children, + el, + null, + parentComponent, + parentSuspense, + resolveChildrenNamespace(vnode, namespace2), + slotScopeIds, + optimized + ); + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "created"); + } + setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent); + if (props) { + for (const key in props) { + if (key !== "value" && !isReservedProp(key)) { + hostPatchProp( + el, + key, + null, + props[key], + namespace2, + vnode.children, + parentComponent, + parentSuspense, + unmountChildren + ); + } + } + if ("value" in props) { + hostPatchProp(el, "value", null, props.value, namespace2); + } + if (vnodeHook = props.onVnodeBeforeMount) { + invokeVNodeHook(vnodeHook, parentComponent, vnode); + } + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); + } + const needCallTransitionHooks = needTransition(parentSuspense, transition); + if (needCallTransitionHooks) { + transition.beforeEnter(el); + } + hostInsert(el, container, anchor); + if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) { + queuePostRenderEffect(() => { + vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); + needCallTransitionHooks && transition.enter(el); + dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); + }, parentSuspense); + } + }; + const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => { + if (scopeId) { + hostSetScopeId(el, scopeId); + } + if (slotScopeIds) { + for (let i = 0; i < slotScopeIds.length; i++) { + hostSetScopeId(el, slotScopeIds[i]); + } + } + if (parentComponent) { + let subTree = parentComponent.subTree; + if (vnode === subTree) { + const parentVNode = parentComponent.vnode; + setScopeId( + el, + parentVNode, + parentVNode.scopeId, + parentVNode.slotScopeIds, + parentComponent.parent + ); + } + } + }; + const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace2, slotScopeIds, optimized, start = 0) => { + for (let i = start; i < children.length; i++) { + const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]); + patch( + null, + child, + container, + anchor, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized + ); + } + }; + const patchElement = (n1, n2, parentComponent, parentSuspense, namespace2, slotScopeIds, optimized) => { + const el = n2.el = n1.el; + let { patchFlag, dynamicChildren, dirs } = n2; + patchFlag |= n1.patchFlag & 16; + const oldProps = n1.props || EMPTY_OBJ; + const newProps = n2.props || EMPTY_OBJ; + let vnodeHook; + parentComponent && toggleRecurse(parentComponent, false); + if (vnodeHook = newProps.onVnodeBeforeUpdate) { + invokeVNodeHook(vnodeHook, parentComponent, n2, n1); + } + if (dirs) { + invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate"); + } + parentComponent && toggleRecurse(parentComponent, true); + if (dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + el, + parentComponent, + parentSuspense, + resolveChildrenNamespace(n2, namespace2), + slotScopeIds + ); + } else if (!optimized) { + patchChildren( + n1, + n2, + el, + null, + parentComponent, + parentSuspense, + resolveChildrenNamespace(n2, namespace2), + slotScopeIds, + false + ); + } + if (patchFlag > 0) { + if (patchFlag & 16) { + patchProps( + el, + n2, + oldProps, + newProps, + parentComponent, + parentSuspense, + namespace2 + ); + } else { + if (patchFlag & 2) { + if (oldProps.class !== newProps.class) { + hostPatchProp(el, "class", null, newProps.class, namespace2); + } + } + if (patchFlag & 4) { + hostPatchProp(el, "style", oldProps.style, newProps.style, namespace2); + } + if (patchFlag & 8) { + const propsToUpdate = n2.dynamicProps; + for (let i = 0; i < propsToUpdate.length; i++) { + const key = propsToUpdate[i]; + const prev = oldProps[key]; + const next = newProps[key]; + if (next !== prev || key === "value") { + hostPatchProp( + el, + key, + prev, + next, + namespace2, + n1.children, + parentComponent, + parentSuspense, + unmountChildren + ); + } + } + } + } + if (patchFlag & 1) { + if (n1.children !== n2.children) { + hostSetElementText(el, n2.children); + } + } + } else if (!optimized && dynamicChildren == null) { + patchProps( + el, + n2, + oldProps, + newProps, + parentComponent, + parentSuspense, + namespace2 + ); + } + if ((vnodeHook = newProps.onVnodeUpdated) || dirs) { + queuePostRenderEffect(() => { + vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1); + dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated"); + }, parentSuspense); + } + }; + const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace2, slotScopeIds) => { + for (let i = 0; i < newChildren.length; i++) { + const oldVNode = oldChildren[i]; + const newVNode = newChildren[i]; + const container = ( + // oldVNode may be an errored async setup() component inside Suspense + // which will not have a mounted element + oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent + // of the Fragment itself so it can move its children. + (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement + // which also requires the correct parent container + !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything. + oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : ( + // In other cases, the parent container is not actually used so we + // just pass the block element here to avoid a DOM parentNode call. + fallbackContainer + ) + ); + patch( + oldVNode, + newVNode, + container, + null, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + true + ); + } + }; + const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, namespace2) => { + if (oldProps !== newProps) { + if (oldProps !== EMPTY_OBJ) { + for (const key in oldProps) { + if (!isReservedProp(key) && !(key in newProps)) { + hostPatchProp( + el, + key, + oldProps[key], + null, + namespace2, + vnode.children, + parentComponent, + parentSuspense, + unmountChildren + ); + } + } + } + for (const key in newProps) { + if (isReservedProp(key)) + continue; + const next = newProps[key]; + const prev = oldProps[key]; + if (next !== prev && key !== "value") { + hostPatchProp( + el, + key, + prev, + next, + namespace2, + vnode.children, + parentComponent, + parentSuspense, + unmountChildren + ); + } + } + if ("value" in newProps) { + hostPatchProp(el, "value", oldProps.value, newProps.value, namespace2); + } + } + }; + const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace2, slotScopeIds, optimized) => { + const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(""); + const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(""); + let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2; + if (fragmentSlotScopeIds) { + slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; + } + if (n1 == null) { + hostInsert(fragmentStartAnchor, container, anchor); + hostInsert(fragmentEndAnchor, container, anchor); + mountChildren( + // #10007 + // such fragment like `<>` will be compiled into + // a fragment which doesn't have a children. + // In this case fallback to an empty array + n2.children || [], + container, + fragmentEndAnchor, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds, + optimized + ); + } else { + if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result + // of renderSlot() with no valid children + n1.dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + container, + parentComponent, + parentSuspense, + namespace2, + slotScopeIds + ); + if ( + // #2080 if the stable fragment has a key, it's a