Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b60d1da4b7 | |||
| 016b259da0 | |||
| bb789e443e | |||
| 0c1842cf02 | |||
| 392e038913 | |||
| d7f25efce2 | |||
| 5246d8c1ba | |||
| f5bfdba124 | |||
| c2c07c6b89 | |||
| 764742dbe7 | |||
| 690aaa714b | |||
| 58037f0b49 | |||
| 3d84e726db | |||
| 9203dc7924 | |||
| 4989cd00e0 | |||
| bed35935ad | |||
| ceaaac3e23 | |||
| db35814ce3 | |||
| 7a5a2110c6 | |||
| 8dbc64cd86 | |||
| deadd197e6 | |||
| 671c8407e5 | |||
| 1956dcc5f4 | |||
| d59d829d5f | |||
| 3c216feb32 | |||
| 032b8eb448 | |||
| 088ea8dc7f | |||
| cd92a2f7b0 | |||
| 0c9eb5f9ef | |||
| 94fbf49fb9 | |||
| 4330a5eaa5 | |||
| 1e5e6bcf3d | |||
| d751c06a67 | |||
| 1c5aa0ce15 | |||
| caaf28b08e | |||
| 1914f703db | |||
| a606cd93cd | |||
| 8b78235ef5 | |||
| f02d082d7b | |||
| a11a3765b8 | |||
| 3cf5ad429d | |||
| 710ddbe261 | |||
| e2ca65ed98 | |||
| ae9b448a64 | |||
| 1ea928118d | |||
| 8f2d739d1f | |||
| 8e89d5e064 | |||
| 8bd961ade1 | |||
| 750d4c6b97 | |||
| 276a4c20f2 | |||
| 98a68074bc |
@@ -1,46 +0,0 @@
|
|||||||
|
|
||||||
name: Push nuget and docker image Actions Workflow
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- stage-new
|
|
||||||
jobs:
|
|
||||||
Deploy:
|
|
||||||
runs-on: windows
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: https://git.afrino.co/actions/checkout@v3
|
|
||||||
- name: Setup dotnet
|
|
||||||
uses: https://git.afrino.co/actions/setup-dotnet@v3
|
|
||||||
with:
|
|
||||||
dotnet-version: 7.0.x
|
|
||||||
|
|
||||||
- name: Remove Package Source
|
|
||||||
run: dotnet nuget remove source FourSat
|
|
||||||
continue-on-error: true
|
|
||||||
- name: Add Package Source
|
|
||||||
run: dotnet nuget add source --name FourSat --username systemuser --password sZSA7PTiv3pUSQZ https://git.afrino.co/api/packages/FourSat/nuget/index.json --store-password-in-clear-text
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: dotnet restore ".\src\FrontOffice.Main\FrontOffice.Main.csproj"
|
|
||||||
- name: Build
|
|
||||||
run: dotnet build ".\src\FrontOffice.Main\FrontOffice.Main.csproj" --configuration Release --no-restore
|
|
||||||
- name: Test
|
|
||||||
run: dotnet test ".\src\FrontOffice.Main\FrontOffice.Main.csproj" --no-restore --verbosity normal
|
|
||||||
- name: Recycle Apppool
|
|
||||||
run: |
|
|
||||||
& "C:\Windows\System32\inetsrv\appcmd.exe" recycle apppool /apppool.name:kbs1.ir
|
|
||||||
shell: powershell
|
|
||||||
- name: Stop Website
|
|
||||||
run: |
|
|
||||||
& "C:\Windows\System32\inetsrv\appcmd.exe" stop site /site.name:kbs1.ir
|
|
||||||
shell: powershell
|
|
||||||
- name: Publish
|
|
||||||
run: dotnet publish ".\src\FrontOffice.Main\FrontOffice.Main.csproj" -c Release -o publish
|
|
||||||
- name: Copy Publish To IIS Directory
|
|
||||||
run: Get-ChildItem -Path "publish\*" | Copy-Item -Destination "E:\kbs1.ir\kbs1.ir\" -Recurse -Force
|
|
||||||
- name: Start Website
|
|
||||||
run: |
|
|
||||||
& "C:\Windows\System32\inetsrv\appcmd.exe" start site /site.name:kbs1.ir
|
|
||||||
shell: powershell
|
|
||||||
@@ -73,10 +73,14 @@ jobs:
|
|||||||
|
|
||||||
# Apply manifests and restart
|
# Apply manifests and restart
|
||||||
sshpass -e ssh -o StrictHostKeyChecking=no root@${{ env.K8S_SERVER }} "
|
sshpass -e ssh -o StrictHostKeyChecking=no root@${{ env.K8S_SERVER }} "
|
||||||
kubectl apply -f /tmp/frontoffice-deployment.yaml &&
|
kubectl apply -n kbs-stage -f /tmp/frontoffice-deployment.yaml &&
|
||||||
crictl rmi ${REGISTRY}/${IMAGE_NAME}:latest 2>/dev/null || true &&
|
# Drop cached :latest so IfNotPresent/Always both pick the new digest
|
||||||
kubectl rollout restart deployment/frontoffice &&
|
# (crictl is broken on this host — use containerd ctr)
|
||||||
kubectl rollout status deployment/frontoffice --timeout=180s &&
|
ctr -n k8s.io images ls -q | grep -E 'frontoffice(:latest|@)' | while read -r ref; do
|
||||||
|
ctr -n k8s.io images rm \"\$ref\" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
kubectl -n kbs-stage rollout restart deployment/frontoffice &&
|
||||||
|
kubectl -n kbs-stage rollout status deployment/frontoffice --timeout=180s &&
|
||||||
rm -f /tmp/frontoffice-deployment.yaml
|
rm -f /tmp/frontoffice-deployment.yaml
|
||||||
"
|
"
|
||||||
echo "✅ Deployed!"
|
echo "✅ Deployed!"
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ jobs:
|
|||||||
done
|
done
|
||||||
|
|
||||||
if ! docker info >/dev/null 2>&1; then
|
if ! docker info >/dev/null 2>&1; then
|
||||||
echo "❌ Docker daemon failed to start after 3 minutes"
|
echo "❌ Docker daemon failed to start"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -56,9 +56,10 @@ jobs:
|
|||||||
- name: Build Docker Image
|
- name: Build Docker Image
|
||||||
run: |
|
run: |
|
||||||
cd src
|
cd src
|
||||||
DOCKER_BUILDKIT=0 docker build --network host -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \
|
DOCKER_BUILDKIT=0 docker build --network host -f FrontOffice.Main/Dockerfile \
|
||||||
|
-t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \
|
||||||
-t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:prod \
|
-t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:prod \
|
||||||
-f FrontOffice.Main/Dockerfile .
|
.
|
||||||
|
|
||||||
- name: Push to Registry
|
- name: Push to Registry
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
name: frontoffice
|
name: frontoffice
|
||||||
namespace: default
|
namespace: kbs-stage
|
||||||
labels:
|
labels:
|
||||||
app: frontoffice
|
app: frontoffice
|
||||||
environment: staging
|
environment: staging
|
||||||
@@ -21,6 +21,7 @@ spec:
|
|||||||
containers:
|
containers:
|
||||||
- name: frontoffice
|
- name: frontoffice
|
||||||
image: 185.252.31.44:30080/admin/frontoffice:latest
|
image: 185.252.31.44:30080/admin/frontoffice:latest
|
||||||
|
# Staging uses :latest — Always avoids stale node cache after registry retag
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 80
|
- containerPort: 80
|
||||||
@@ -43,7 +44,7 @@ apiVersion: v1
|
|||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: frontoffice-svc
|
name: frontoffice-svc
|
||||||
namespace: default
|
namespace: kbs-stage
|
||||||
labels:
|
labels:
|
||||||
app: frontoffice
|
app: frontoffice
|
||||||
spec:
|
spec:
|
||||||
@@ -54,3 +55,31 @@ spec:
|
|||||||
targetPort: 80
|
targetPort: 80
|
||||||
name: http
|
name: http
|
||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
|
|
||||||
|
---
|
||||||
|
# FrontOffice Ingress
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: frontoffice-ingress
|
||||||
|
namespace: kbs-stage
|
||||||
|
annotations:
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
|
spec:
|
||||||
|
ingressClassName: nginx
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- frontoffice.se.kbs1.ir
|
||||||
|
secretName: frontoffice-tls
|
||||||
|
rules:
|
||||||
|
- host: frontoffice.se.kbs1.ir
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: frontoffice-svc
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
|||||||
@@ -94,8 +94,47 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@* ═══════════════════════════════════════════════
|
@* ═══════════════════════════════════════════════
|
||||||
2. HOW IT WORKS — 3 numbered steps
|
1c. TWENTYCARD CREDIT — promo box
|
||||||
═══════════════════════════════════════════════ *@
|
═══════════════════════════════════════════════ *@
|
||||||
|
<section class="py-4" style="background:var(--mud-palette-surface);">
|
||||||
|
<MudContainer MaxWidth="MaxWidth.Medium">
|
||||||
|
<MudPaper Elevation="0" Class="landing-twentycard-box rounded-xl pa-4 pa-md-5">
|
||||||
|
<MudStack Row="true" Spacing="3" AlignItems="AlignItems.Start" Class="flex-wrap">
|
||||||
|
<MudAvatar Color="Color.Info" Variant="Variant.Filled" Size="Size.Large" Class="rounded-lg" Style="min-width:56px;">
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.AccountBalance" />
|
||||||
|
</MudAvatar>
|
||||||
|
<MudStack Spacing="2" Style="flex:1; min-width:220px;">
|
||||||
|
<MudText Typo="Typo.h6">تأمین اعتبار ۲۰کارت</MudText>
|
||||||
|
<MudText Typo="Typo.body2" Class="mud-text-secondary">
|
||||||
|
با تأمین اعتبار از طریق ۲۰کارت میتوانید بدون پرداخت نقدی کامل، هزینه خرید پکیج و محصولات در کارا بازار را پوشش دهید.
|
||||||
|
فرایند درخواست و تأیید اعتبار در پنل ۲۰کارت انجام میشود و پس از آن پرداخت از همان مسیر در دسترس است.
|
||||||
|
این روش برای کسانی مناسب است که میخواهند سریعتر وارد مسیر عضویت و خرید شوند.
|
||||||
|
</MudText>
|
||||||
|
<MudText Typo="Typo.body2">
|
||||||
|
بعد از دریافت وام، میتوانید در کارا بازار از باشگاه مشتریان استفاده کنید و با فروش و دعوت، توسعه سرمایه داشته باشید.
|
||||||
|
</MudText>
|
||||||
|
<div class="mt-1">
|
||||||
|
<MudButton Variant="Variant.Filled"
|
||||||
|
Color="Color.Info"
|
||||||
|
Class="rounded-pill"
|
||||||
|
StartIcon="@Icons.Material.Filled.OpenInNew"
|
||||||
|
Disabled="@string.IsNullOrWhiteSpace(_twentyCardPortalUrl)"
|
||||||
|
OnClick="OpenTwentyCardPortal">
|
||||||
|
ورود به سایت ۲۰کارت
|
||||||
|
</MudButton>
|
||||||
|
</div>
|
||||||
|
</MudStack>
|
||||||
|
</MudStack>
|
||||||
|
</MudPaper>
|
||||||
|
</MudContainer>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
@* ═══════════════════════════════════════════════
|
||||||
|
2. HOW IT WORKS — 3 numbered steps
|
||||||
|
(appsettings Landing:ShowStepsSection; default false)
|
||||||
|
═══════════════════════════════════════════════ *@
|
||||||
|
@if (_showStepsSection)
|
||||||
|
{
|
||||||
<section class="section-landing">
|
<section class="section-landing">
|
||||||
<MudContainer MaxWidth="MaxWidth.Large">
|
<MudContainer MaxWidth="MaxWidth.Large">
|
||||||
<div class="text-center mb-8 fade-in-up">
|
<div class="text-center mb-8 fade-in-up">
|
||||||
@@ -121,10 +160,14 @@
|
|||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudContainer>
|
</MudContainer>
|
||||||
</section>
|
</section>
|
||||||
|
}
|
||||||
|
|
||||||
@* ═══════════════════════════════════════════════
|
@* ═══════════════════════════════════════════════
|
||||||
3. FEATURES — 6 cards with icons
|
3. FEATURES — 6 cards with icons
|
||||||
|
(appsettings Landing:ShowFeaturesSection; default false)
|
||||||
═══════════════════════════════════════════════ *@
|
═══════════════════════════════════════════════ *@
|
||||||
|
@if (_showFeaturesSection)
|
||||||
|
{
|
||||||
<section class="section-landing" style="background:var(--mud-palette-background-gray);">
|
<section class="section-landing" style="background:var(--mud-palette-background-gray);">
|
||||||
<MudContainer MaxWidth="MaxWidth.Large">
|
<MudContainer MaxWidth="MaxWidth.Large">
|
||||||
<div class="text-center mb-8 fade-in-up">
|
<div class="text-center mb-8 fade-in-up">
|
||||||
@@ -152,6 +195,7 @@
|
|||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudContainer>
|
</MudContainer>
|
||||||
</section>
|
</section>
|
||||||
|
}
|
||||||
|
|
||||||
@* ═══════════════════════════════════════════════
|
@* ═══════════════════════════════════════════════
|
||||||
4. STATS — Counter cards
|
4. STATS — Counter cards
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using FrontOffice.Main.Utilities;
|
using FrontOffice.Main.Utilities;
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.JSInterop;
|
using Microsoft.JSInterop;
|
||||||
using MudBlazor;
|
using MudBlazor;
|
||||||
|
|
||||||
@@ -16,8 +17,12 @@ public partial class Index : IDisposable
|
|||||||
[Inject] private DiscountCartService DiscountCart { get; set; } = default!;
|
[Inject] private DiscountCartService DiscountCart { get; set; } = default!;
|
||||||
[Inject] private GuestActionGate GuestGate { get; set; } = default!;
|
[Inject] private GuestActionGate GuestGate { get; set; } = default!;
|
||||||
[Inject] private VATService VAT { get; set; } = default!;
|
[Inject] private VATService VAT { get; set; } = default!;
|
||||||
|
[Inject] private IConfiguration Configuration { get; set; } = default!;
|
||||||
|
|
||||||
private bool _isAuthenticated;
|
private bool _isAuthenticated;
|
||||||
|
private string _twentyCardPortalUrl = string.Empty;
|
||||||
|
private bool _showStepsSection;
|
||||||
|
private bool _showFeaturesSection;
|
||||||
|
|
||||||
// ── CMS page data ──
|
// ── CMS page data ──
|
||||||
private PageSettingsDto? _pageData;
|
private PageSettingsDto? _pageData;
|
||||||
@@ -49,6 +54,10 @@ public partial class Index : IDisposable
|
|||||||
{
|
{
|
||||||
MainService.OnChangeHandler += OnStateChanged;
|
MainService.OnChangeHandler += OnStateChanged;
|
||||||
_isAuthenticated = await AuthService.IsAuthenticatedAsync();
|
_isAuthenticated = await AuthService.IsAuthenticatedAsync();
|
||||||
|
_twentyCardPortalUrl = Configuration["TwentyCard:CreditPortalUrl"] ?? string.Empty;
|
||||||
|
// appsettings Landing:* — default false (hidden). Set true to restore sections.
|
||||||
|
_showStepsSection = Configuration.GetValue("Landing:ShowStepsSection", false);
|
||||||
|
_showFeaturesSection = Configuration.GetValue("Landing:ShowFeaturesSection", false);
|
||||||
|
|
||||||
// Load landing page settings from CMS
|
// Load landing page settings from CMS
|
||||||
try
|
try
|
||||||
@@ -298,6 +307,12 @@ public partial class Index : IDisposable
|
|||||||
Navigation.NavigateTo(RouteConstants.Registration.Wizard);
|
Navigation.NavigateTo(RouteConstants.Registration.Wizard);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task OpenTwentyCardPortal()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(_twentyCardPortalUrl)) return;
|
||||||
|
await JS.InvokeVoidAsync("open", _twentyCardPortalUrl, "_blank");
|
||||||
|
}
|
||||||
|
|
||||||
private void NavigateToPost(string slug)
|
private void NavigateToPost(string slug)
|
||||||
{
|
{
|
||||||
Navigation.NavigateTo($"/blog/{slug}");
|
Navigation.NavigateTo($"/blog/{slug}");
|
||||||
@@ -334,8 +349,10 @@ public partial class Index : IDisposable
|
|||||||
public string? HeroButtonPrimaryText { get; set; }
|
public string? HeroButtonPrimaryText { get; set; }
|
||||||
public string? HeroButtonSecondaryText { get; set; }
|
public string? HeroButtonSecondaryText { get; set; }
|
||||||
public List<TrustBadgeItem>? TrustBadges { get; set; }
|
public List<TrustBadgeItem>? TrustBadges { get; set; }
|
||||||
|
public bool? StepsEnabled { get; set; }
|
||||||
public string? StepsTitle { get; set; }
|
public string? StepsTitle { get; set; }
|
||||||
public List<StepItem>? Steps { get; set; }
|
public List<StepItem>? Steps { get; set; }
|
||||||
|
public bool? FeaturesEnabled { get; set; }
|
||||||
public string? FeaturesTitle { get; set; }
|
public string? FeaturesTitle { get; set; }
|
||||||
public List<FeatureItem>? Features { get; set; }
|
public List<FeatureItem>? Features { get; set; }
|
||||||
public string? StatsTitle { get; set; }
|
public string? StatsTitle { get; set; }
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
<MudDivider Class="my-4" />
|
<MudDivider Class="my-4" />
|
||||||
|
|
||||||
<MudText Typo="Typo.body2" Color="Color.Secondary">
|
<MudText Typo="Typo.body2" Color="Color.Secondary">
|
||||||
موجودی کیف پول: @FormatPrice(_walletBalance)
|
موجودی کیف پول اصلی: @FormatPrice(_walletBalance)
|
||||||
</MudText>
|
</MudText>
|
||||||
|
|
||||||
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="mt-6"
|
<MudButton Color="Color.Primary" Variant="Variant.Filled" Class="mt-6"
|
||||||
|
|||||||
@@ -45,6 +45,9 @@
|
|||||||
Href="https://wa.me/989123456789"
|
Href="https://wa.me/989123456789"
|
||||||
Target="_blank" />
|
Target="_blank" />
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
<MudStack Row="true" Spacing="2" Class="enamad">
|
||||||
|
<a referrerpolicy='origin' target='_blank' href='https://trustseal.enamad.ir/?id=688255&Code=uoMRGkyUYHAtMxkpBLB0KyPL5Ac66ACX'><img referrerpolicy='origin' src='https://trustseal.enamad.ir/logo.aspx?id=688255&Code=uoMRGkyUYHAtMxkpBLB0KyPL5Ac66ACX' alt='' style='cursor:pointer' code='uoMRGkyUYHAtMxkpBLB0KyPL5Ac66ACX'></a>
|
||||||
|
</MudStack>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
{
|
{
|
||||||
"GwUrl": "https://cms.kbs1.ir",
|
"GwUrl": "https://cms.kbs2.ir",
|
||||||
"DownloadUrl": "",
|
"DownloadUrl": "",
|
||||||
"TwentyCard": {
|
|
||||||
"CreditPortalUrl": "https://userpanel.20card.ir/"
|
|
||||||
},
|
|
||||||
"EncryptionSettings": {
|
"EncryptionSettings": {
|
||||||
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
|
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
|
||||||
"IV": "1wyF3Tt142MOkCpIyCxh/g=="
|
"IV": "1wyF3Tt142MOkCpIyCxh/g=="
|
||||||
@@ -17,5 +14,10 @@
|
|||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Seo": {
|
||||||
|
"SiteUrl": "https://kbs2.ir",
|
||||||
|
"SiteName": "کارابازار سلامت",
|
||||||
|
"DefaultDescription": "باشگاه مشتریان کارابازار سلامت (KBS) — فروشگاه محصولات سلامت، پاداش شفاف، کیف پول و شبکه فروش."
|
||||||
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"TwentyCard": {
|
"TwentyCard": {
|
||||||
"CreditPortalUrl": "https://userpanel.20card.ir/"
|
"CreditPortalUrl": "https://userpanel.20card.ir/"
|
||||||
},
|
},
|
||||||
|
"Landing": {
|
||||||
|
"ShowStepsSection": false,
|
||||||
|
"ShowFeaturesSection": false
|
||||||
|
},
|
||||||
"EncryptionSettings": {
|
"EncryptionSettings": {
|
||||||
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
|
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
|
||||||
"IV": "1wyF3Tt142MOkCpIyCxh/g=="
|
"IV": "1wyF3Tt142MOkCpIyCxh/g=="
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
"TwentyCard": {
|
"TwentyCard": {
|
||||||
"CreditPortalUrl": "https://userpanel.20card.ir/"
|
"CreditPortalUrl": "https://userpanel.20card.ir/"
|
||||||
},
|
},
|
||||||
|
"Landing": {
|
||||||
|
"ShowStepsSection": false,
|
||||||
|
"ShowFeaturesSection": false
|
||||||
|
},
|
||||||
"EncryptionSettings": {
|
"EncryptionSettings": {
|
||||||
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
|
"Key": "kmcQ3XTmH4mrdh8VHziuscyf8LLYjG//Kyni81nH/0E=",
|
||||||
"IV": "1wyF3Tt142MOkCpIyCxh/g=="
|
"IV": "1wyF3Tt142MOkCpIyCxh/g=="
|
||||||
|
|||||||
@@ -1617,6 +1617,12 @@ html, body {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ── Landing TwentyCard credit promo ── */
|
||||||
|
.landing-twentycard-box {
|
||||||
|
background: var(--ds-info-soft);
|
||||||
|
border: 1px solid rgba(59, 130, 246, 0.22);
|
||||||
|
}
|
||||||
|
|
||||||
/* ── Register Wizard Unified ── */
|
/* ── Register Wizard Unified ── */
|
||||||
.wizard-section {
|
.wizard-section {
|
||||||
min-height: 80vh;
|
min-height: 80vh;
|
||||||
|
|||||||
Reference in New Issue
Block a user