feat & fix : add version 0.17.16.23 , fix respons home page , add changelog

add change log dialog , add home page view model
release
Amir Hossein Khademi 2024-02-25 18:21:01 +03:30
parent 5b91275d3e
commit acb8cfc638
13 changed files with 363 additions and 31 deletions

View File

@ -0,0 +1,80 @@
@using NetinaShop.Domain.Dtos.ResponseDtos
<MudDialog DisableSidePadding="true" class="mx-auto">
<DialogContent >
<MudStack>
<MudStack class="mx-10 mt-7 mb-5" Spacing="0">
<MudStack Row="true">
<MudText Typo="Typo.h5" class="my-auto">ورژن جدید : </MudText>
<MudText Typo="Typo.h3" class="font-bold" Color="Color.Success">@AdminChangeLog.Version</MudText>
</MudStack>
<MudText Typo="Typo.body1">@AdminChangeLog.Description</MudText>
</MudStack>
<MudContainer>
<MudTimeline TimelinePosition="TimelinePosition.Start" DisableModifiers="false">
<MudTimelineItem Color="Color.Info" Size="Size.Small">
<ItemOpposite>
<MudText Color="Color.Info" Typo="Typo.h5">1977</MudText>
</ItemOpposite>
<ItemContent>
<MudCard Outlined="true" Elevation="25">
<MudCardContent>
<MudText Color="Color.Info" Typo="Typo.h6" GutterBottom="true">ویژگی های جدید</MudText>
<MudStack Spacing="0" Row="true" class="flex-wrap">
@foreach (var item in AdminChangeLog.Features)
{
<MudChip Variant="Variant.Outlined" Color="Color.Default">@item</MudChip>
}
</MudStack>
</MudCardContent>
</MudCard>
</ItemContent>
</MudTimelineItem>
<MudTimelineItem TimelineAlign="TimelineAlign.End" Color="Color.Error" Size="Size.Small">
<ItemOpposite>
<MudText Color="Color.Error" Typo="Typo.h5">1979</MudText>
</ItemOpposite>
<ItemContent>
<MudCard Outlined="true" Elevation="25">
<MudCardContent>
<MudText Color="Color.Error" Typo="Typo.h6" GutterBottom="true">مشکلات رفع شده</MudText>
<MudStack Spacing="0" Row="true" class="flex-wrap">
@foreach (var item in AdminChangeLog.BugFixes)
{
<MudChip Variant="Variant.Outlined" Color="Color.Default">@item</MudChip>
}
</MudStack>
</MudCardContent>
</MudCard>
</ItemContent>
</MudTimelineItem>
</MudTimeline>
</MudContainer>
</MudStack>
</DialogContent>
<DialogActions>
<MudStack Row="true" class="w-full mx-4 mb-2">
<MudButton class="w-full" Variant="Variant.Outlined" Size="Size.Large" Color="Color.Error" OnClick="Cancel">بستن</MudButton>
</MudStack>
</DialogActions>
</MudDialog>
@code {
[CascadingParameter]
MudDialogInstance MudDialog { get; set; }
[Parameter]
public AdminChangeLogResponseDto AdminChangeLog { get; set; } = new();
void Cancel() => MudDialog.Cancel();
protected override Task OnParametersSetAsync()
{
return base.OnParametersSetAsync();
}
}

View File

@ -24,4 +24,5 @@ public static class Address
public static string PageController => $"{BaseAddress}/page";
public static string ScraperController => $"{BaseAddress}/scraper";
public static string NewsletterMemberController => $"{BaseAddress}/newsletter/member";
public static string DashboardController => $"{BaseAddress}/dashboard";
}

View File

@ -5,8 +5,8 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
<AssemblyVersion>0.10.16.23</AssemblyVersion>
<FileVersion>0.10.16.23</FileVersion>
<AssemblyVersion>0.17.16.23</AssemblyVersion>
<FileVersion>0.17.16.23</FileVersion>
<AssemblyName>$(MSBuildProjectName)</AssemblyName>
</PropertyGroup>
@ -55,6 +55,7 @@
<Using Include="NetinaShop.Common.Models.Api" />
<Using Include="NetinaShop.Common.Models.Exception" />
<Using Include="NetinaShop.Domain.CommandQueries.Commands" />
<Using Include="NetinaShop.Domain.Dtos.DashboardDtos" />
<Using Include="NetinaShop.Domain.Dtos.LargDtos" />
<Using Include="NetinaShop.Domain.Dtos.RequestDtos" />
<Using Include="NetinaShop.Domain.Dtos.SmallDtos" />
@ -66,4 +67,10 @@
<Using Include="System.Collections.ObjectModel" />
</ItemGroup>
<ItemGroup>
<Content Update="version.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

View File

@ -2,70 +2,76 @@
@page "/home"
@attribute [Microsoft.AspNetCore.Authorization.Authorize]
<MudStack class="p-8 w-full h-screen overflow-y-scroll bg-[--mud-palette-background-grey]">
<MudHidden Breakpoint="Breakpoint.SmAndDown">
@inject IDialogService DialogService
@inject NavigationManager NavigationManager
@inject ISnackbar Snackbar
@inject IUserUtility UserUtility
@inject IRestWrapper RestWrapper
<MudStack class="px-0 md:p-5 lg:p-8 w-full h-screen overflow-x-hidden overflow-y-scroll bg-[--mud-palette-background-grey]">
<MudHidden Breakpoint="Breakpoint.Xs">
<MudGrid>
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد محصولاتــ</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>@ViewModel.PageDto.ProductsCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد بلاگــ ها</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-blue-600"><b>845</b></MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-blue-600"><b>@ViewModel.PageDto.BlogsCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">فروش های امروز</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-lime-600"><b>125</b></MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-lime-600"><b>@ViewModel.PageDto.TodayOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">فروش های تایید نشده</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-rose-600"><b>10</b></MudText>
<MudText Typo="Typo.body1" class="mb-4">تایید نشده</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-rose-600"><b>@ViewModel.PageDto.UnSubmittedOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد برنـــدها</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-gray-600"><b>125</b></MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-gray-600"><b>@ViewModel.PageDto.BrandsCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudItem>
<MudItem xs="12" sm="4" lg="2">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد مشترکین</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-purple-600"><b>5632</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-purple-600"><b>@ViewModel.PageDto.SubscribersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>نفر</b></MudText>
</MudPaper>
</MudItem>
</MudGrid>
</MudHidden>
<MudHidden Breakpoint="Breakpoint.SmAndUp">
<MudStack Row="true" class="h-60 w-screen overflow-x-scroll">
<MudStack Row="true" class="whitespace-nowrap overflow-x-scroll w-screen no-scrollbar">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد محصولاتــ</MudText>
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">تعداد محصولاتــ</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد محصولاتــ</MudText>
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">تعداد محصولاتــ</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تعداد محصولاتــ</MudText>
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">تعداد محصولاتــ</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
@ -78,7 +84,8 @@
<BaseButtonUi class="w-full rounded-md"
Icon="@Icons.Material.Outlined.AddCard"
Variant="Variant.Outlined" Color="Color.Default"
Content="افزودن محصول جدید" />
OnClickCallback="@ViewModel.AddProductClicked"
Content="محصول جدید" />
</MudStack>
</MudItem>
@ -88,7 +95,8 @@
<BaseButtonUi class="w-full rounded-md"
Icon="@Icons.Material.Outlined.AddLink"
Variant="Variant.Outlined" Color="Color.Default"
Content="افزودن بلاگ جدید" />
OnClickCallback="@ViewModel.AddBlogClicked"
Content="بلاگ جدید" />
</MudStack>
</MudItem>
@ -98,7 +106,8 @@
<BaseButtonUi class="w-full rounded-md"
Icon="@Icons.Material.Outlined.AddBusiness"
Variant="Variant.Outlined" Color="Color.Default"
Content="افزودن برند جدید" />
OnClickCallback="@ViewModel.AddBrandClicked"
Content="برند جدید" />
</MudStack>
</MudItem>
</MudGrid>
@ -152,4 +161,17 @@
</MudStack>
</MudItem>
</MudGrid>
</MudStack>
</MudStack>
@code{
public HomeViewModel ViewModel { get; set; }
protected override async Task OnInitializedAsync()
{
ViewModel = new HomeViewModel(Snackbar, UserUtility, RestWrapper, DialogService);
await ViewModel.InitializeAsync();
await base.OnInitializedAsync();
}
}

View File

@ -0,0 +1,81 @@
using NetinaShop.Domain.Entities.Brands;
namespace NetinaShop.AdminPanel.PWA.Pages;
public class HomeViewModel : BaseViewModel<HomeDashboardDto>
{
private readonly ISnackbar _snackbar;
private readonly IUserUtility _userUtility;
private readonly IRestWrapper _restWrapper;
private readonly IDialogService _dialogService;
public HomeViewModel(ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService)
{
_snackbar = snackbar;
_userUtility = userUtility;
_restWrapper = restWrapper;
_dialogService = dialogService;
}
public override async Task InitializeAsync()
{
try
{
IsProcessing = true;
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
var dto = await _restWrapper.DashboardApiRest.GetHomeDashboardAsync(token);
PageDto = dto;
var changeLog = await _restWrapper.UserRestApi.GetChangeLogAsync(token);
if (changeLog.IsNewVersion)
{
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true, NoHeader = true, DisableBackdropClick = true };
var parameters = new DialogParameters<ChangeLogDialogBox> { { x => x.AdminChangeLog,changeLog } };
await _dialogService.ShowAsync<ChangeLogDialogBox>("", parameters, maxWidth);
}
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
}
catch (Exception e)
{
_snackbar.Add(e.Message.Contains("Failed to fetch") ? "اینترنت خود را بررسی نمایید" : e.Message, Severity.Error);
}
finally
{
IsProcessing = false;
}
await base.InitializeAsync();
}
public async Task AddBlogClicked()
{
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true };
await _dialogService.ShowAsync<BlogActionDialogBox>("افزودن بلاگ جدید", maxWidth);
}
public async Task AddProductClicked()
{
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Large, FullWidth = true, DisableBackdropClick = true };
var dialogResult = await _dialogService.ShowAsync<ProductActionDialogBox>("افزودن محصول جدید", maxWidth);
var result = await dialogResult.Result;
if (!result.Canceled && result.Data is bool and true)
{
await InitializeAsync();
}
}
public async Task AddBrandClicked()
{
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true, DisableBackdropClick = true };
await _dialogService.ShowAsync<BrandActionDialogBox>("افزودن برند جدید", maxWidth);
}
}

View File

@ -0,0 +1,7 @@
namespace NetinaShop.AdminPanel.PWA.Services.RestServices;
public interface IDashboardApiRest
{
[Get("/home")]
public Task<HomeDashboardDto> GetHomeDashboardAsync([Header("Authorization")] string authorization);
}

View File

@ -20,4 +20,5 @@ public interface IRestWrapper
public IPaymentRestApi PaymentRestApi { get; }
public IPageRestApi PageRestApi { get; }
public IScraperRestApi ScraperRestApi { get; }
public IDashboardApiRest DashboardApiRest { get; }
}

View File

@ -1,4 +1,6 @@
namespace NetinaShop.AdminPanel.PWA.Services.RestServices;
using NetinaShop.Domain.Dtos.ResponseDtos;
namespace NetinaShop.AdminPanel.PWA.Services.RestServices;
public interface IUserRestApi
{
@ -7,6 +9,9 @@ public interface IUserRestApi
[Post("")]
Task CreateUserAsync([Body] UserActionRequestDto request, [Header("Authorization")] string authorization);
[Get("/changelog")]
Task<AdminChangeLogResponseDto> GetChangeLogAsync([Header("Authorization")] string authorization);
[Get("/{id}")]
Task<ApplicationUserSDto> ReadOne(Guid id, [Header("Authorization")] string authorization);
[Get("")]

View File

@ -32,4 +32,6 @@ public class RestWrapper : IRestWrapper
public IPaymentRestApi PaymentRestApi => RestService.For<IPaymentRestApi>(Address.PaymentController, setting);
public IPageRestApi PageRestApi => RestService.For<IPageRestApi>(Address.PageController, setting);
public IScraperRestApi ScraperRestApi => RestService.For<IScraperRestApi>(Address.ScraperController, setting);
public IDashboardApiRest DashboardApiRest => RestService.For<IDashboardApiRest>(Address.DashboardController, setting);
}

View File

@ -0,0 +1,20 @@
{
"version": "0.17.16.23",
"versionNumber": 0.101623,
"versionName": "چرتکه",
"description": "",
"features": [
"افزودن خبرنامه",
"افزودن نام انگلیسی برند",
"افزودن دیالوگ اپدیت جدید",
"افزودن تخفیف همکاری در فروش",
"افزودن قابلیت تغییر نمایش سریع کالا"
],
"bugFixes": [
"حل مشکلات امنیتی",
"حل مشکل ویرایش کالا",
"حل مشکل فیلترهای کالاها",
"حل مشکل رسپانسیو صفحه اصلی",
"حل مشکل انتخاب دسته بندی در صفحه کالاها"
]
}

View File

@ -94,6 +94,16 @@
}
}
/* Hide scrollbar for Chrome, Safari and Opera */
.no-scrollbar::-webkit-scrollbar {
display: none;
}
/* Hide scrollbar for IE, Edge and Firefox */
.no-scrollbar {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
.mud-dialog-title {
font-family: iranyekan !important;

View File

@ -1064,6 +1064,10 @@ input:checked + .toggle-bg {
margin-left: 0.25rem;
margin-right: 0.25rem;
}
.mx-10 {
margin-left: 2.5rem;
margin-right: 2.5rem;
}
.mx-3 {
margin-left: 0.75rem;
margin-right: 0.75rem;
@ -1132,9 +1136,15 @@ input:checked + .toggle-bg {
.mb-5 {
margin-bottom: 1.25rem;
}
.mb-6 {
margin-bottom: 1.5rem;
}
.mb-8 {
margin-bottom: 2rem;
}
.ml-16 {
margin-left: 4rem;
}
.mr-1 {
margin-right: 0.25rem;
}
@ -1165,6 +1175,9 @@ input:checked + .toggle-bg {
.mt-6 {
margin-top: 1.5rem;
}
.mt-7 {
margin-top: 1.75rem;
}
.mt-8 {
margin-top: 2rem;
}
@ -1222,9 +1235,6 @@ input:checked + .toggle-bg {
.h-6 {
height: 1.5rem;
}
.h-60 {
height: 15rem;
}
.h-64 {
height: 16rem;
}
@ -1301,6 +1311,10 @@ input:checked + .toggle-bg {
.w-96 {
width: 24rem;
}
.w-fit {
width: -moz-fit-content;
width: fit-content;
}
.w-full {
width: 100%;
}
@ -1420,12 +1434,18 @@ input:checked + .toggle-bg {
.overflow-hidden {
overflow: hidden;
}
.overflow-x-hidden {
overflow-x: hidden;
}
.overflow-x-scroll {
overflow-x: scroll;
}
.overflow-y-scroll {
overflow-y: scroll;
}
.whitespace-nowrap {
white-space: nowrap;
}
.rounded-full {
border-radius: 9999px;
}
@ -1582,6 +1602,10 @@ input:checked + .toggle-bg {
.p-8 {
padding: 2rem;
}
.px-0 {
padding-left: 0px;
padding-right: 0px;
}
.px-1 {
padding-left: 0.25rem;
padding-right: 0.25rem;
@ -1862,6 +1886,16 @@ input:checked + .toggle-bg {
url('../assets/fonts/ttf/iranyekanwebextrablackfanum.ttf') format('truetype');
}
/* Hide scrollbar for Chrome, Safari and Opera */
.no-scrollbar::-webkit-scrollbar {
display: none;
}
/* Hide scrollbar for IE, Edge and Firefox */
.no-scrollbar {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
.mud-dialog-title {
font-family: iranyekan !important;
@ -2073,6 +2107,10 @@ code {
border-top-right-radius: 0px;
}
.md\:p-5 {
padding: 1.25rem;
}
.md\:px-10 {
padding-left: 2.5rem;
padding-right: 2.5rem;
@ -2105,6 +2143,10 @@ code {
width: 38rem;
}
.lg\:p-8 {
padding: 2rem;
}
.lg\:px-20 {
padding-left: 5rem;
padding-right: 5rem;

View File

@ -1140,6 +1140,11 @@ input:checked + .toggle-bg {
margin-right: 0.25rem;
}
.mx-10 {
margin-left: 2.5rem;
margin-right: 2.5rem;
}
.mx-3 {
margin-left: 0.75rem;
margin-right: 0.75rem;
@ -1228,10 +1233,18 @@ input:checked + .toggle-bg {
margin-bottom: 1.25rem;
}
.mb-6 {
margin-bottom: 1.5rem;
}
.mb-8 {
margin-bottom: 2rem;
}
.ml-16 {
margin-left: 4rem;
}
.mr-1 {
margin-right: 0.25rem;
}
@ -1272,6 +1285,10 @@ input:checked + .toggle-bg {
margin-top: 1.5rem;
}
.mt-7 {
margin-top: 1.75rem;
}
.mt-8 {
margin-top: 2rem;
}
@ -1347,10 +1364,6 @@ input:checked + .toggle-bg {
height: 1.5rem;
}
.h-60 {
height: 15rem;
}
.h-64 {
height: 16rem;
}
@ -1452,6 +1465,11 @@ input:checked + .toggle-bg {
width: 24rem;
}
.w-fit {
width: -moz-fit-content;
width: fit-content;
}
.w-full {
width: 100%;
}
@ -1606,6 +1624,10 @@ input:checked + .toggle-bg {
overflow: hidden;
}
.overflow-x-hidden {
overflow-x: hidden;
}
.overflow-x-scroll {
overflow-x: scroll;
}
@ -1614,6 +1636,10 @@ input:checked + .toggle-bg {
overflow-y: scroll;
}
.whitespace-nowrap {
white-space: nowrap;
}
.rounded-full {
border-radius: 9999px;
}
@ -1815,6 +1841,11 @@ input:checked + .toggle-bg {
padding: 2rem;
}
.px-0 {
padding-left: 0px;
padding-right: 0px;
}
.px-1 {
padding-left: 0.25rem;
padding-right: 0.25rem;
@ -2179,6 +2210,21 @@ input:checked + .toggle-bg {
url('../assets/fonts/ttf/iranyekanwebextrablackfanum.ttf') format('truetype');
}
/* Hide scrollbar for Chrome, Safari and Opera */
.no-scrollbar::-webkit-scrollbar {
display: none;
}
/* Hide scrollbar for IE, Edge and Firefox */
.no-scrollbar {
-ms-overflow-style: none;
/* IE and Edge */
scrollbar-width: none;
/* Firefox */
}
.mud-dialog-title {
font-family: iranyekan !important;
}
@ -2387,6 +2433,10 @@ code {
border-top-right-radius: 0px;
}
.md\:p-5 {
padding: 1.25rem;
}
.md\:px-10 {
padding-left: 2.5rem;
padding-right: 2.5rem;
@ -2418,6 +2468,10 @@ code {
width: 38rem;
}
.lg\:p-8 {
padding: 2rem;
}
.lg\:px-20 {
padding-left: 5rem;
padding-right: 5rem;