feat(AddBanner) , feat(AddCatelog) , feat(AddPersonalizationPage)
parent
d457803c30
commit
77a6cf80a2
|
@ -43,6 +43,10 @@
|
||||||
<MudNavLink Href="management/faqs" Icon="@Icons.Material.Filled.ManageAccounts">سوالات متداول</MudNavLink>
|
<MudNavLink Href="management/faqs" Icon="@Icons.Material.Filled.ManageAccounts">سوالات متداول</MudNavLink>
|
||||||
</MudNavGroup>
|
</MudNavGroup>
|
||||||
|
|
||||||
|
<MudNavGroup Title="شخصی سازی" Expanded="false" Icon="@Icons.Material.Filled.SettingsSystemDaydream">
|
||||||
|
<MudNavLink Href="personaliztion/main" Icon="@Icons.Material.Filled.SettingsBrightness">کاتالوگ و بنرها</MudNavLink>
|
||||||
|
</MudNavGroup>
|
||||||
|
|
||||||
@if (isShop)
|
@if (isShop)
|
||||||
{
|
{
|
||||||
<MudNavGroup Title="حسابداری" Expanded="false"
|
<MudNavGroup Title="حسابداری" Expanded="false"
|
||||||
|
|
|
@ -0,0 +1,243 @@
|
||||||
|
@page "/personaliztion/main"
|
||||||
|
@attribute [Microsoft.AspNetCore.Authorization.Authorize]
|
||||||
|
|
||||||
|
@inject IDialogService DialogService
|
||||||
|
@inject ISnackbar Snackbar
|
||||||
|
@inject IUserUtility UserUtility
|
||||||
|
@inject IRestWrapper RestWrapper
|
||||||
|
@inject NavigationManager NavigationManager
|
||||||
|
@inject IConfiguration Configuration
|
||||||
|
@inject IJSRuntime JsRuntime
|
||||||
|
|
||||||
|
|
||||||
|
<MudStack class="h-full w-full p-8">
|
||||||
|
<MudPaper class="px-5 py-5">
|
||||||
|
<MudStack Row="true">
|
||||||
|
<MudStack class="mx-2 mb-5">
|
||||||
|
<MudText Typo="Typo.h4">اطلاعات بنر ها وکاتالوگ</MudText>
|
||||||
|
<MudText Typo="Typo.caption">بنر ها و کاتالوگ در صفحه اصلی و دیگر صفحه ها نمایش داده خواهند شد</MudText>
|
||||||
|
</MudStack>
|
||||||
|
<MudSpacer />
|
||||||
|
<BaseButtonUi Size="Size.Large"
|
||||||
|
OnClickCallback="ViewModel.SubmitSettingAsync"
|
||||||
|
class="mb-8 mt-2 w-64 rounded-md"
|
||||||
|
IsProcessing="@ViewModel.IsProcessing"
|
||||||
|
Icon="@Icons.Material.Outlined.Check"
|
||||||
|
Content="ثبتـــ اطلاعات" Variant="Variant.Filled" Color="Color.Success" />
|
||||||
|
</MudStack>
|
||||||
|
<MudDivider />
|
||||||
|
|
||||||
|
<MudStack class="mt-3">
|
||||||
|
<MudText Typo="Typo.h6">بنر های سایت شما</MudText>
|
||||||
|
</MudStack>
|
||||||
|
<MudGrid>
|
||||||
|
<MudItem xs="12" md="4">
|
||||||
|
<MudTextField T="string" @bind-Value="@ViewModel.NewBanner.Title" class="my-2" Variant="Variant.Outlined" Label="عنوان بنر"></MudTextField>
|
||||||
|
<MudTextField T="string" @bind-Value="@ViewModel.NewBanner.Link" class="my-2" Variant="Variant.Outlined" Label="لینک بنر"></MudTextField>
|
||||||
|
<MudTextField T="string" @bind-Value="@ViewModel.NewBanner.Description" class="my-2" Variant="Variant.Outlined" Label="توضیحات بنر"></MudTextField>
|
||||||
|
<MudSelect Variant="Variant.Outlined" class="my-2" T="BannerSection" ToStringFunc="type => type.ToDisplay()" Label="محل قرارگیری بنر" @bind-Value="ViewModel.NewBanner.Section">
|
||||||
|
@foreach (var state in Enum.GetValues(typeof(BannerSection)).Cast<BannerSection>())
|
||||||
|
{
|
||||||
|
<MudSelectItem T="BannerSection" Value="@state"></MudSelectItem>
|
||||||
|
}
|
||||||
|
</MudSelect>
|
||||||
|
@if (ViewModel.NewBanner.ImageLocation.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
<MudButton class="mt-3"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
FullWidth="true"
|
||||||
|
Color="Color.Info"
|
||||||
|
OnClick="@ViewModel.SelectFileAsync">انتخاب تصویر بنر</MudButton>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudButton class="mt-3"
|
||||||
|
Variant="Variant.Filled"
|
||||||
|
FullWidth="true"
|
||||||
|
Color="Color.Info"
|
||||||
|
OnClick="@ViewModel.SelectFileAsync">انتخاب تصویر دیگر</MudButton>
|
||||||
|
}
|
||||||
|
<MudButton class="mt-3"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
FullWidth="true"
|
||||||
|
Color="Color.Info"
|
||||||
|
OnClick="@ViewModel.AddBanner">افزودن بنر</MudButton>
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12" md="8">
|
||||||
|
|
||||||
|
<MudDataGrid Items="@ViewModel.PageDto.Banners"
|
||||||
|
T="BannerItemModel"
|
||||||
|
Elevation="0"
|
||||||
|
Outlined="true"
|
||||||
|
Bordered="true"
|
||||||
|
Striped="false"
|
||||||
|
Dense="true"
|
||||||
|
Filterable="false"
|
||||||
|
SortMode="@SortMode.None"
|
||||||
|
Groupable="false">
|
||||||
|
<Columns>
|
||||||
|
<PropertyColumn T="BannerItemModel" TProperty="string" Property="x => x.Title" Title="نام فارسی" />
|
||||||
|
<TemplateColumn T="BannerItemModel" Title="جایگاه بنر" CellClass="d-flex justify-end">
|
||||||
|
<CellTemplate>
|
||||||
|
<MudStack Row="true">
|
||||||
|
<MudText Align="Align.Center">@context.Item.Section.ToDisplay()</MudText>
|
||||||
|
</MudStack>
|
||||||
|
</CellTemplate>
|
||||||
|
</TemplateColumn>
|
||||||
|
<PropertyColumn T="BannerItemModel" TProperty="string" Property="x => x.Description" Title="نام انگلیسی" />
|
||||||
|
|
||||||
|
<TemplateColumn T="BannerItemModel" CellClass="d-flex justify-end">
|
||||||
|
<CellTemplate>
|
||||||
|
<MudStack Row="true">
|
||||||
|
|
||||||
|
<MudButton DisableElevation="true"
|
||||||
|
Size="@Size.Small"
|
||||||
|
Variant="@Variant.Outlined"
|
||||||
|
OnClick="async()=>await ShowBannerPhoto(context.Item.ImageLocation)"
|
||||||
|
Color="@Color.Info"
|
||||||
|
StartIcon="@Icons.Material.Filled.RemoveRedEye">مشاهده تصویر</MudButton>
|
||||||
|
|
||||||
|
<MudButton DisableElevation="true"
|
||||||
|
Size="@Size.Small"
|
||||||
|
Variant="@Variant.Outlined"
|
||||||
|
OnClick="async()=>await ShowBannerLink(context.Item.Link)"
|
||||||
|
Color="@Color.Info"
|
||||||
|
StartIcon="@Icons.Material.Outlined.AttachFile">مشاهده لینک</MudButton>
|
||||||
|
|
||||||
|
<MudButton DisableElevation="true"
|
||||||
|
Size="@Size.Small"
|
||||||
|
Variant="@Variant.Outlined"
|
||||||
|
OnClick="() => ViewModel.PageDto.Banners.Remove(context.Item)"
|
||||||
|
Color="@Color.Error"
|
||||||
|
StartIcon="@Icons.Material.Outlined.Delete">حذف</MudButton>
|
||||||
|
</MudStack>
|
||||||
|
</CellTemplate>
|
||||||
|
</TemplateColumn>
|
||||||
|
</Columns>
|
||||||
|
</MudDataGrid>
|
||||||
|
</MudItem>
|
||||||
|
</MudGrid>
|
||||||
|
|
||||||
|
<MudDivider class="mt-5" />
|
||||||
|
|
||||||
|
<MudStack class="mb-1 mt-3" Spacing="0">
|
||||||
|
<MudText Typo="Typo.h6">کاتالوگ سایت شما</MudText>
|
||||||
|
<MudText Typo="Typo.caption">کاتالوگ به لیست فهرست مانند صفحه اصلی گفته میشود که تورهای مختلف را نمایش میدهد</MudText>
|
||||||
|
</MudStack>
|
||||||
|
<MudGrid>
|
||||||
|
<MudItem xs="12" sm="6" lg="1">
|
||||||
|
<MudTextField T="int" @bind-Value="@ViewModel.NewCatalogItem.Row" Variant="Variant.Outlined" Label="ردیف"></MudTextField>
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12" sm="6" lg="4">
|
||||||
|
<MudTextField T="string" @bind-Value="@ViewModel.NewCatalogItem.PersianName" Variant="Variant.Outlined" Label="نام فارسی کاتالوگ"></MudTextField>
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12" sm="6" lg="4">
|
||||||
|
<MudTextField T="string" @bind-Value="@ViewModel.NewCatalogItem.EnglishName" Variant="Variant.Outlined" Label="نام انگلیسی"></MudTextField>
|
||||||
|
</MudItem>
|
||||||
|
|
||||||
|
<MudItem xs="12" sm="6" lg="3">
|
||||||
|
<MudAutocomplete ToStringFunc="dto => dto.PersianName"
|
||||||
|
T="CatalogItemModel"
|
||||||
|
@bind-Value="ViewModel.SelectedCatalog"
|
||||||
|
MaxItems="306"
|
||||||
|
SearchFunc="ViewModel.SearchCatalog"
|
||||||
|
Label="کاتالوگ پدر"
|
||||||
|
Variant="Variant.Outlined">
|
||||||
|
<ItemTemplate Context="e">
|
||||||
|
|
||||||
|
<p>@e.PersianName</p>
|
||||||
|
</ItemTemplate>
|
||||||
|
</MudAutocomplete>
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12" sm="6" lg="6">
|
||||||
|
<MudTextField T="string" @bind-Value="@ViewModel.NewCatalogItem.Query" Variant="Variant.Outlined" Label="کوئری"></MudTextField>
|
||||||
|
</MudItem>
|
||||||
|
|
||||||
|
|
||||||
|
<MudItem xs="12" sm="6" lg="3">
|
||||||
|
@if (ViewModel.CatalogImage.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
<MudButton class="mt-3 py-3"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
FullWidth="true"
|
||||||
|
Color="Color.Info"
|
||||||
|
OnClick="@ViewModel.SelectCatalogFileAsync">انتخاب تصویر کاتالوگ</MudButton>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudButton class="mt-3 py-3"
|
||||||
|
Variant="Variant.Filled"
|
||||||
|
FullWidth="true"
|
||||||
|
Color="Color.Info"
|
||||||
|
OnClick="@ViewModel.SelectCatalogFileAsync">انتخاب تصویر دیگر</MudButton>
|
||||||
|
}
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12" sm="6" lg="2">
|
||||||
|
|
||||||
|
<MudButton Variant="Variant.Outlined"
|
||||||
|
FullWidth="true"
|
||||||
|
class="mt-2 py-3"
|
||||||
|
Color="Color.Info"
|
||||||
|
OnClick="@ViewModel.AddCatalogItem">+</MudButton>
|
||||||
|
</MudItem>
|
||||||
|
</MudGrid>
|
||||||
|
|
||||||
|
|
||||||
|
<MudDataGrid Items="@ViewModel.PageDto.Catalog"
|
||||||
|
T="CatalogItemModel"
|
||||||
|
class="mt-2"
|
||||||
|
Elevation="0"
|
||||||
|
Outlined="true"
|
||||||
|
Bordered="false"
|
||||||
|
Dense="true"
|
||||||
|
Striped="false"
|
||||||
|
Filterable="false"
|
||||||
|
SortMode="@SortMode.None"
|
||||||
|
Groupable="false">
|
||||||
|
<Columns>
|
||||||
|
<PropertyColumn T="CatalogItemModel" TProperty="int" Property="x => x.Row" Title=" " />
|
||||||
|
<PropertyColumn T="CatalogItemModel" TProperty="string" Property="x => x.PersianName" Title="نام فارسی" />
|
||||||
|
<PropertyColumn T="CatalogItemModel" TProperty="string" Property="x => x.ParentName" Title="دسته پدر" />
|
||||||
|
<PropertyColumn T="CatalogItemModel" TProperty="string" Property="x => x.EnglishName" Title="نام انگلیسی" />
|
||||||
|
<PropertyColumn T="CatalogItemModel" TProperty="string" Property="x => x.Query" Title="کوئری" />
|
||||||
|
<TemplateColumn T="CatalogItemModel" CellClass="d-flex justify-end">
|
||||||
|
<CellTemplate>
|
||||||
|
<MudStack Row>
|
||||||
|
<MudButton DisableElevation="true"
|
||||||
|
Size="@Size.Small"
|
||||||
|
Variant="@Variant.Outlined"
|
||||||
|
OnClick="() => ViewModel.PageDto.Catalog.Remove(context.Item)"
|
||||||
|
Color="@Color.Error"
|
||||||
|
StartIcon="@Icons.Material.Outlined.Delete">حذف</MudButton>
|
||||||
|
</MudStack>
|
||||||
|
</CellTemplate>
|
||||||
|
</TemplateColumn>
|
||||||
|
</Columns>
|
||||||
|
</MudDataGrid>
|
||||||
|
</MudPaper>
|
||||||
|
</MudStack>
|
||||||
|
|
||||||
|
|
||||||
|
@code
|
||||||
|
{
|
||||||
|
public PersonalizationPageViewModel ViewModel { get; set; }
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
ViewModel = new PersonalizationPageViewModel(DialogService, RestWrapper, Snackbar, NavigationManager, UserUtility);
|
||||||
|
await ViewModel.InitializeAsync();
|
||||||
|
await base.OnInitializedAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ShowBannerPhoto(string photoUrl)
|
||||||
|
{
|
||||||
|
var webUrl = Configuration.GetValue<string>("StorageBaseUrl") ?? string.Empty;
|
||||||
|
var url = $"{webUrl}/{photoUrl}";
|
||||||
|
await JsRuntime.InvokeVoidAsyncIgnoreErrors("open", url, "_blank");
|
||||||
|
}
|
||||||
|
private async Task ShowBannerLink(string url)
|
||||||
|
{
|
||||||
|
await JsRuntime.InvokeVoidAsyncIgnoreErrors("open", url, "_blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,167 @@
|
||||||
|
using System.Net.Http.Json;
|
||||||
|
|
||||||
|
namespace Netina.AdminPanel.PWA.Pages.Personalization;
|
||||||
|
|
||||||
|
public class PersonalizationPageViewModel(IDialogService dialogService, IRestWrapper restWrapper,
|
||||||
|
ISnackbar snackbar, NavigationManager navigationManager, IUserUtility userUtility)
|
||||||
|
: BaseViewModel<PersonalizationSetting>(userUtility: userUtility)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override async Task InitializeAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var token = await userUtility.GetBearerTokenAsync();
|
||||||
|
if (token == null)
|
||||||
|
throw new Exception("Token is null");
|
||||||
|
var personalizationSetting = await restWrapper.SettingRestApi.GetSettingAsync<PersonalizationSetting>(nameof(PersonalizationSetting), token);
|
||||||
|
personalizationSetting.Catalog = personalizationSetting.Catalog.OrderBy(c => c.Row).ToList();
|
||||||
|
PageDto = personalizationSetting;
|
||||||
|
}
|
||||||
|
catch (ApiException ex)
|
||||||
|
{
|
||||||
|
|
||||||
|
var exe = await ex.GetContentAsAsync<ApiResult>();
|
||||||
|
if (ex.StatusCode == HttpStatusCode.Unauthorized)
|
||||||
|
{
|
||||||
|
await userUtility.LogoutAsync();
|
||||||
|
navigationManager.NavigateTo("login", true, true);
|
||||||
|
}
|
||||||
|
snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
snackbar.Add(e.Message, Severity.Error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
await base.InitializeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task SubmitSettingAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var token = await userUtility.GetBearerTokenAsync();
|
||||||
|
if (token == null)
|
||||||
|
throw new Exception("Token is null");
|
||||||
|
await restWrapper.SettingRestApi.PostSettingAsync(nameof(PersonalizationSetting), PageDto, token);
|
||||||
|
snackbar.Add("تنظیمات شخصی سازی با موفقیت تغییر یافت", Severity.Success);
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (ApiException ex)
|
||||||
|
{
|
||||||
|
|
||||||
|
var exe = await ex.GetContentAsAsync<ApiResult>();
|
||||||
|
if (ex.StatusCode == HttpStatusCode.Unauthorized)
|
||||||
|
{
|
||||||
|
await userUtility.LogoutAsync();
|
||||||
|
navigationManager.NavigateTo("login", true, true);
|
||||||
|
}
|
||||||
|
snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
snackbar.Add(e.Message, Severity.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public BannerItemModel NewBanner { get; set; } = new();
|
||||||
|
public CatalogItemModel NewCatalogItem { get; set; } = new();
|
||||||
|
|
||||||
|
public void AddBanner()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (NewBanner.ImageLocation.IsNullOrEmpty())
|
||||||
|
throw new Exception("تصویر بنر انتخاب نشده است");
|
||||||
|
if (NewBanner.Title.IsNullOrEmpty())
|
||||||
|
throw new Exception("عنوان بنر انتخاب نشده است");
|
||||||
|
|
||||||
|
PageDto.Banners.Add(NewBanner);
|
||||||
|
NewBanner = new BannerItemModel();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
snackbar.Add(e.Message, Severity.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async Task SelectFileAsync()
|
||||||
|
{
|
||||||
|
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Large, FullWidth = true, DisableBackdropClick = true };
|
||||||
|
var dialog = await dialogService.ShowAsync<StorageDialogBox>("انتخاب عکس", maxWidth);
|
||||||
|
var result = await dialog.Result;
|
||||||
|
var file = result.Data;
|
||||||
|
if (file is StorageFileSDto storageFile)
|
||||||
|
{
|
||||||
|
NewBanner.ImageLocation = storageFile.FileLocation;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public CatalogItemModel? SelectedCatalog { get; set; }
|
||||||
|
public async Task<IEnumerable<CatalogItemModel>> SearchCatalog(string catelogName)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (catelogName.IsNullOrEmpty())
|
||||||
|
return PageDto.Catalog;
|
||||||
|
return PageDto.Catalog.Where(f => f.PersianName.Contains(catelogName));
|
||||||
|
}
|
||||||
|
catch (ApiException ex)
|
||||||
|
{
|
||||||
|
var exe = await ex.GetContentAsAsync<ApiResult>();
|
||||||
|
snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
|
||||||
|
return new List<CatalogItemModel>();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
snackbar.Add(e.Message, Severity.Error);
|
||||||
|
return new List<CatalogItemModel>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string CatalogImage { get; set; } = string.Empty;
|
||||||
|
public async Task SelectCatalogFileAsync()
|
||||||
|
{
|
||||||
|
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Large, FullWidth = true, DisableBackdropClick = true };
|
||||||
|
var dialog = await dialogService.ShowAsync<StorageDialogBox>("انتخاب عکس", maxWidth);
|
||||||
|
var result = await dialog.Result;
|
||||||
|
var file = result.Data;
|
||||||
|
if (file is StorageFileSDto storageFile)
|
||||||
|
{
|
||||||
|
CatalogImage = storageFile.FileLocation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void AddCatalogItem()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (NewCatalogItem.EnglishName.IsNullOrEmpty())
|
||||||
|
throw new Exception("نام انگلیسی را وارد کنید");
|
||||||
|
if (NewCatalogItem.PersianName.IsNullOrEmpty())
|
||||||
|
throw new Exception("نام فارسی ایتم کاتالوگ را وارد کنید");
|
||||||
|
if (NewCatalogItem.Query.IsNullOrEmpty())
|
||||||
|
throw new Exception("کوئری ایتم کاتالوگ را وارد کنید");
|
||||||
|
if (SelectedCatalog != null)
|
||||||
|
{
|
||||||
|
NewCatalogItem.ParentId = SelectedCatalog.Id;
|
||||||
|
NewCatalogItem.ParentName = SelectedCatalog.PersianName;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
NewCatalogItem.IsMain = true;
|
||||||
|
|
||||||
|
if (!CatalogImage.IsNullOrEmpty())
|
||||||
|
NewCatalogItem.ImageLocation = CatalogImage;
|
||||||
|
CatalogImage = string.Empty;
|
||||||
|
NewCatalogItem.Id = Guid.NewGuid();
|
||||||
|
PageDto.Catalog.Add(NewCatalogItem);
|
||||||
|
PageDto.Catalog = PageDto.Catalog.OrderBy(c => c.Row).ToList();
|
||||||
|
NewCatalogItem = new CatalogItemModel();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
snackbar.Add(e.Message, Severity.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1209,6 +1209,9 @@ input:checked + .toggle-bg {
|
||||||
.mt-4 {
|
.mt-4 {
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
}
|
}
|
||||||
|
.mt-5 {
|
||||||
|
margin-top: 1.25rem;
|
||||||
|
}
|
||||||
.mt-6 {
|
.mt-6 {
|
||||||
margin-top: 1.5rem;
|
margin-top: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue