add payments page layouts
This commit is contained in:
@@ -4,4 +4,4 @@
|
|||||||
npm run dev
|
npm run dev
|
||||||
```
|
```
|
||||||
|
|
||||||
Open [http://localhost:3000](http://localhost:3000)
|
Open [http://localhost:2999](http://localhost:2999)
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Metadata } from 'next';
|
import { Metadata } from 'next';
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: 'page 1',
|
title: 'emptypage',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
@@ -9,7 +9,7 @@ export default function Home() {
|
|||||||
<div>
|
<div>
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div>
|
||||||
page 1
|
emptypage
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import { Metadata } from 'next';
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
|
||||||
title: 'page 2',
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Home() {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<main>
|
|
||||||
<div>
|
|
||||||
page 2
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import { Metadata } from 'next';
|
||||||
|
import UserUsage from '@/app/ui/payment/user-usage';
|
||||||
|
import TokensSpendStats from '@/app/ui/payment/tokens-spend-stats';
|
||||||
|
import PaymentTabs from '@/app/ui/payment/payment-tabs';
|
||||||
|
import SecurePayments from '@/app/ui/payment/secure-payments';
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: 'payment',
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<main>
|
||||||
|
<div className="payment-container">
|
||||||
|
<div>
|
||||||
|
<h1 className="page-title">💳 Управление подпиской и токенами</h1>
|
||||||
|
<p>
|
||||||
|
Выберите подходящий тарифный план или пополните баланс токенов для защиты файлов
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<UserUsage />
|
||||||
|
<TokensSpendStats />
|
||||||
|
<PaymentTabs />
|
||||||
|
<SecurePayments />
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
@use './header.scss';
|
@use './header.scss';
|
||||||
@use './dashboard.scss';
|
@use './dashboard.scss';
|
||||||
@use './settings.scss';
|
@use './settings.scss';
|
||||||
|
@use './payment-container.scss';
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
padding: 12px 24px;
|
padding: 12px 24px;
|
||||||
|
|||||||
@@ -0,0 +1,340 @@
|
|||||||
|
.payment-container {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 15px;
|
||||||
|
|
||||||
|
.page-title {
|
||||||
|
font-size: 1.8rem;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.usage-stats,
|
||||||
|
.tokens-stats {
|
||||||
|
background: white;
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 25px;
|
||||||
|
margin-bottom: 25px;
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
color: #1e293b;
|
||||||
|
font-size: 1.15rem;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.stats-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||||||
|
gap: 16px;
|
||||||
|
|
||||||
|
.stat-card {
|
||||||
|
background: #f8fafc;
|
||||||
|
border-radius: 14px;
|
||||||
|
padding: 16px;
|
||||||
|
text-align: center;
|
||||||
|
border: 1px solid #e2e8f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-value {
|
||||||
|
font-size: 1.6rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #1e293b;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-label {
|
||||||
|
color: #64748b;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-bar {
|
||||||
|
width: 100%;
|
||||||
|
height: 6px;
|
||||||
|
background: #e2e8f0;
|
||||||
|
border-radius: 3px;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-fill {
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(90deg, #10b981, #059669);
|
||||||
|
transition: width 1s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tokens-stats {
|
||||||
|
.tokens-comparison {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
gap: 20px;
|
||||||
|
margin-bottom: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.month-stats {
|
||||||
|
background: #f8fafc;
|
||||||
|
border-radius: 14px;
|
||||||
|
padding: 16px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
&.current {
|
||||||
|
background: linear-gradient(135deg, #e0e7ff, #c7d2fe);
|
||||||
|
border: 2px solid #6366f1;
|
||||||
|
|
||||||
|
.spent-amount {
|
||||||
|
background: linear-gradient(135deg, #6366f1, #8b5cf6);
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.spent-amount {
|
||||||
|
font-size: 2.2rem;
|
||||||
|
font-weight: 800;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
color: #64748b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.month-title {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #1e293b;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spent-label {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spent-label,
|
||||||
|
.protected-label {
|
||||||
|
color: #64748b;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment-tabs {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
margin-bottom: 25px;
|
||||||
|
background: white;
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 6px;
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
|
||||||
|
|
||||||
|
.payment-tab {
|
||||||
|
flex: 1;
|
||||||
|
text-align: center;
|
||||||
|
padding: 12px 16px;
|
||||||
|
border-radius: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all .3s;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
color: #64748b;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
background: linear-gradient(135deg, #6366f1, #8b5cf6);
|
||||||
|
color: white;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 8px 25px rgba(99, 102, 241, 0.3);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(135deg, #6366f1, #8b5cf6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(135deg, #d7d8e9, #aa90e9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-content {
|
||||||
|
.billing-toggle {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
|
||||||
|
&>div {
|
||||||
|
display: inline-block;
|
||||||
|
background: white;
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 5px;
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.billing-btn {
|
||||||
|
padding: 10px 25px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: 0.3s;
|
||||||
|
background: transparent;
|
||||||
|
color: rgb(100, 116, 139);
|
||||||
|
position: relative;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
background: linear-gradient(135deg, rgb(99, 102, 241), rgb(139, 92, 246));
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
position: absolute;
|
||||||
|
top: -6px;
|
||||||
|
right: -6px;
|
||||||
|
background: #f59e0b;
|
||||||
|
color: white;
|
||||||
|
font-size: 9px;
|
||||||
|
padding: 2px 5px;
|
||||||
|
border-radius: 6px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.subscription-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
||||||
|
gap: 20px;
|
||||||
|
margin-bottom: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan-card {
|
||||||
|
background: white;
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 25px;
|
||||||
|
position: relative;
|
||||||
|
border: 2px solid #e2e8f0;
|
||||||
|
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
cursor: pointer;
|
||||||
|
overflow: visible;
|
||||||
|
|
||||||
|
.plan-header {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan-icon {
|
||||||
|
font-size: 2.5rem;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.1));
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan-name {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #1e293b;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan-price {
|
||||||
|
font-size: 2rem;
|
||||||
|
font-weight: 800;
|
||||||
|
background: linear-gradient(135deg, #6366f1, #8b5cf6);
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan-period {
|
||||||
|
color: #64748b;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan-tokens {
|
||||||
|
background: linear-gradient(135deg, #e3f2fd, #bbdefb);
|
||||||
|
color: #1976d2;
|
||||||
|
padding: 6px 14px;
|
||||||
|
border-radius: 16px;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-weight: 600;
|
||||||
|
margin: 12px auto;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan-features {
|
||||||
|
list-style: none;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plan-feature {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 6px 0;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
color: #374151;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-icon {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: #10b981;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
color: white;
|
||||||
|
font-size: 11px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
&.not {
|
||||||
|
background: #ef4444;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.secure-payments-wrapper {
|
||||||
|
background: white;
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 20px;
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
color: #1e293b;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.secure-payments-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
|
||||||
|
gap: 16px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.secure-payments-card {
|
||||||
|
padding: 12px;
|
||||||
|
|
||||||
|
.secure-payments-card-header {
|
||||||
|
font-size: 1.8rem;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
color: #1e293b;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: #64748b;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,7 +12,10 @@ export default function HeaderPanel() {
|
|||||||
<input type="text" placeholder="Поиск контента..." id="global-search" />
|
<input type="text" placeholder="Поиск контента..." id="global-search" />
|
||||||
</div>
|
</div>
|
||||||
<div className="header-action">
|
<div className="header-action">
|
||||||
<div className="tokens-balance">
|
<Link
|
||||||
|
href={'/pages/payment'}
|
||||||
|
className="tokens-balance"
|
||||||
|
>
|
||||||
<div className="tokens-wrapper" title="Текущий баланс токенов для защиты файлов">
|
<div className="tokens-wrapper" title="Текущий баланс токенов для защиты файлов">
|
||||||
<svg viewBox="0 0 24 24" fill="currentColor" style={{ width: "16px", height: "16px" }}>
|
<svg viewBox="0 0 24 24" fill="currentColor" style={{ width: "16px", height: "16px" }}>
|
||||||
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z"></path>
|
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z"></path>
|
||||||
@@ -20,7 +23,7 @@ export default function HeaderPanel() {
|
|||||||
<span className="tokens-count">800</span>
|
<span className="tokens-count">800</span>
|
||||||
<span className="tokens-label">токенов</span>
|
<span className="tokens-label">токенов</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</Link>
|
||||||
<NotificationsButton />
|
<NotificationsButton />
|
||||||
<Link
|
<Link
|
||||||
className="icon-btn"
|
className="icon-btn"
|
||||||
|
|||||||
@@ -15,27 +15,27 @@ export default function DropDownList() {
|
|||||||
const links = [
|
const links = [
|
||||||
{
|
{
|
||||||
name: 'Маркировка фото',
|
name: 'Маркировка фото',
|
||||||
href: '/pages/page1'
|
href: '/pages/emptypage'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Маркировка видео',
|
name: 'Маркировка видео',
|
||||||
href: '/pages/page1'
|
href: '/pages/emptypage'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Маркировка аудио',
|
name: 'Маркировка аудио',
|
||||||
href: '/pages/page1'
|
href: '/pages/emptypage'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Маркировка PDF',
|
name: 'Маркировка PDF',
|
||||||
href: '/pages/page1'
|
href: '/pages/emptypage'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Маркировка PHP/JS',
|
name: 'Маркировка PHP/JS',
|
||||||
href: '/pages/page1'
|
href: '/pages/emptypage'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Маркировка Текста',
|
name: 'Маркировка Текста',
|
||||||
href: '/pages/page1'
|
href: '/pages/emptypage'
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { logout } from '@/app/actions/auth';
|
|||||||
const links = [
|
const links = [
|
||||||
{
|
{
|
||||||
name: 'Отчёты',
|
name: 'Отчёты',
|
||||||
href: '/pages/page1',
|
href: '/pages/emptypage',
|
||||||
img: 'M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z'
|
img: 'M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -21,27 +21,27 @@ const links = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Мой контент',
|
name: 'Мой контент',
|
||||||
href: '/pages/page1',
|
href: '/pages/emptypage',
|
||||||
img: 'M20 6h-2.18c.11-.31.18-.65.18-1a2.996 2.996 0 0 0-5.5-1.65l-.5.67-.5-.68C10.96 2.54 10 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM9 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1z'
|
img: 'M20 6h-2.18c.11-.31.18-.65.18-1a2.996 2.996 0 0 0-5.5-1.65l-.5.67-.5-.68C10.96 2.54 10 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM9 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1z'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Реферальная программа',
|
name: 'Реферальная программа',
|
||||||
href: '/pages/page1',
|
href: '/pages/emptypage',
|
||||||
img: 'M16 4c0-1.11.89-2 2-2s2 .89 2 2-.89 2-2 2-2-.89-2-2zm4 18v-6h2.5l-2.54-7.63A1.5 1.5 0 0 0 18.54 8H16c-.8 0-1.54.37-2 1l-3 4v2h2l2.54-3.82L16.5 18H20z'
|
img: 'M16 4c0-1.11.89-2 2-2s2 .89 2 2-.89 2-2 2-2-.89-2-2zm4 18v-6h2.5l-2.54-7.63A1.5 1.5 0 0 0 18.54 8H16c-.8 0-1.54.37-2 1l-3 4v2h2l2.54-3.82L16.5 18H20z'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Нарушения',
|
name: 'Нарушения',
|
||||||
href: '/pages/page1',
|
href: '/pages/emptypage',
|
||||||
img: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z'
|
img: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Поиск',
|
name: 'Поиск',
|
||||||
href: '/pages/page1',
|
href: '/pages/emptypage',
|
||||||
img: 'M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'
|
img: 'M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'API',
|
name: 'API',
|
||||||
href: '/pages/page1',
|
href: '/pages/emptypage',
|
||||||
img: 'M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0L19.2 12l-4.6-4.6L16 6l6 6-6 6-1.4-1.4z'
|
img: 'M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0L19.2 12l-4.6-4.6L16 6l6 6-6 6-1.4-1.4z'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
export default function PaymentTubBuyTokens() {
|
||||||
|
return (
|
||||||
|
<div className="tab-content">
|
||||||
|
PaymentTubBuyTokens
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
export default function PaymentTabTariffs() {
|
||||||
|
return (
|
||||||
|
<div className="tab-content">
|
||||||
|
<div className="billing-toggle">
|
||||||
|
<div>
|
||||||
|
<button className="billing-btn active">💳 Помесячно</button>
|
||||||
|
<button className="billing-btn">
|
||||||
|
🔥 Годовая
|
||||||
|
<span>ВЫГОДНО</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="subscription-grid">
|
||||||
|
<div className="plan-card animate-card">
|
||||||
|
<div className="plan-header">
|
||||||
|
<div className="plan-icon">🚀</div>
|
||||||
|
<h3 className="plan-name">СТАРТ</h3>
|
||||||
|
<div className="plan-price">900₽</div>
|
||||||
|
<div className="plan-period">в месяц</div>
|
||||||
|
<div className="plan-tokens">100 токенов включено</div>
|
||||||
|
</div>
|
||||||
|
<ul className="plan-features">
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
100 файлов в месяц
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
1 ГБ хранилища
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
До 10 МБ на файл
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
Базовые модули защиты
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
Поддержка 24/7
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon not">✗</span>
|
||||||
|
API доступ
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div className="plan-card animate-card">
|
||||||
|
<div className="plan-header">
|
||||||
|
<div className="plan-icon">🚀</div>
|
||||||
|
<h3 className="plan-name">ПРЕМИУМ</h3>
|
||||||
|
<div className="plan-price">3500₽</div>
|
||||||
|
<div className="plan-period">в месяц</div>
|
||||||
|
<div className="plan-tokens">100 токенов включено</div>
|
||||||
|
</div>
|
||||||
|
<ul className="plan-features">
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
100 файлов в месяц
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
1 ГБ хранилища
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
До 10 МБ на файл
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
Базовые модули защиты
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
Поддержка 24/7
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon not">✗</span>
|
||||||
|
API доступ
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div className="plan-card animate-card">
|
||||||
|
<div className="plan-header">
|
||||||
|
<div className="plan-icon">🚀</div>
|
||||||
|
<h3 className="plan-name">ПРОФИ</h3>
|
||||||
|
<div className="plan-price">9500₽</div>
|
||||||
|
<div className="plan-period">в месяц</div>
|
||||||
|
<div className="plan-tokens">100 токенов включено</div>
|
||||||
|
</div>
|
||||||
|
<ul className="plan-features">
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
100 файлов в месяц
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
1 ГБ хранилища
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
До 10 МБ на файл
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
Базовые модули защиты
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon">✓</span>
|
||||||
|
Поддержка 24/7
|
||||||
|
</li>
|
||||||
|
<li className="plan-feature">
|
||||||
|
<span className="feature-icon not">✗</span>
|
||||||
|
API доступ
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
export default function PaymentTabTransactionHistory() {
|
||||||
|
return (
|
||||||
|
<div className="tab-content">
|
||||||
|
payment-tab-transaction-history
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import { useState } from 'react';
|
||||||
|
import PaymentTabTariffs from '@/app/ui/payment/payment-tab-tariffs';
|
||||||
|
import PaymentTubBuyTokens from './payment-tab-buy-tokens';
|
||||||
|
import PaymentTabTransactionHistory from './payment-tab-transaction-history';
|
||||||
|
|
||||||
|
|
||||||
|
export default function PaymentTabs() {
|
||||||
|
let [selectedTab, setSelectedTab] = useState('1');
|
||||||
|
function switchTabsHandler(tab: string) {
|
||||||
|
console.log('click');
|
||||||
|
setSelectedTab(tab);
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="payment-tabs">
|
||||||
|
<button
|
||||||
|
className={`payment-tab ${selectedTab === '1' ? 'active' : ''}`}
|
||||||
|
onClick={() => {
|
||||||
|
switchTabsHandler('1')
|
||||||
|
}}>
|
||||||
|
Тарифные планы
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className={`payment-tab ${selectedTab === '2' ? 'active' : ''}`}
|
||||||
|
onClick={() => {
|
||||||
|
switchTabsHandler('2')
|
||||||
|
}}>
|
||||||
|
Пополнить токены
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className={`payment-tab ${selectedTab === '3' ? 'active' : ''}`}
|
||||||
|
onClick={() => {
|
||||||
|
switchTabsHandler('3')
|
||||||
|
}}>
|
||||||
|
История операций
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="tab-content">
|
||||||
|
{selectedTab === '1' && (
|
||||||
|
<PaymentTabTariffs/>
|
||||||
|
)}
|
||||||
|
{selectedTab === '2' && (
|
||||||
|
<PaymentTubBuyTokens/>
|
||||||
|
)}
|
||||||
|
{selectedTab === '3' && (
|
||||||
|
<PaymentTabTransactionHistory/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
export default function SecurePayments() {
|
||||||
|
return (
|
||||||
|
<div className="secure-payments-wrapper">
|
||||||
|
<h3>
|
||||||
|
🔒 Безопасные платежи
|
||||||
|
</h3>
|
||||||
|
<div className="secure-payments-grid">
|
||||||
|
<div className="secure-payments-card">
|
||||||
|
<div className="secure-payments-card-header">
|
||||||
|
🪪
|
||||||
|
</div>
|
||||||
|
<h4>Яндекс.Касса</h4>
|
||||||
|
<p>Надёжная платёжная система с защитой данных</p>
|
||||||
|
</div>
|
||||||
|
<div className="secure-payments-card">
|
||||||
|
<div className="secure-payments-card-header">
|
||||||
|
💳
|
||||||
|
</div>
|
||||||
|
<h4>Все способы оплаты</h4>
|
||||||
|
<p>Банковские карты, электронные кошельки, СБП</p>
|
||||||
|
</div>
|
||||||
|
<div className="secure-payments-card">
|
||||||
|
<div className="secure-payments-card-header">
|
||||||
|
🔐
|
||||||
|
</div>
|
||||||
|
<h4>SSL шифрование</h4>
|
||||||
|
<p>Ваши платёжные данные защищены</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
export default function TokensSpendStats() {
|
||||||
|
return (
|
||||||
|
<div className="tokens-stats">
|
||||||
|
<h3>
|
||||||
|
Статистика трат токенов
|
||||||
|
</h3>
|
||||||
|
<div className="tokens-comparison">
|
||||||
|
<div className="month-stats current">
|
||||||
|
<div className="month-title">
|
||||||
|
Текущий месяц (декабрь 2025)
|
||||||
|
</div>
|
||||||
|
<div className="spent-amount">
|
||||||
|
0
|
||||||
|
</div>
|
||||||
|
<div className="spent-label">
|
||||||
|
токенов потрачено
|
||||||
|
</div>
|
||||||
|
<div className="protected-label">
|
||||||
|
Защищено файлов: <span>0</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="month-stats">
|
||||||
|
<div className="month-title">
|
||||||
|
Прошлый месяц (ноябрь 2025)
|
||||||
|
</div>
|
||||||
|
<div className="spent-amount">
|
||||||
|
0
|
||||||
|
</div>
|
||||||
|
<div className="spent-label">
|
||||||
|
токенов потрачено
|
||||||
|
</div>
|
||||||
|
<div className="protected-label">
|
||||||
|
Защищено файлов: <span>0</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
export default function UserUsage() {
|
||||||
|
return (
|
||||||
|
<div className="usage-stats">
|
||||||
|
<h3>
|
||||||
|
📊 Ваше использование
|
||||||
|
</h3>
|
||||||
|
<div className="stats-grid">
|
||||||
|
<div className="stat-card">
|
||||||
|
<div className="stat-value">0 / 2,000</div>
|
||||||
|
<div className="stat-label">Файлов в месяц</div>
|
||||||
|
<div className="progress-bar">
|
||||||
|
<div
|
||||||
|
className="progress-fill"
|
||||||
|
style={{ width: '50%' }}
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="stat-card">
|
||||||
|
<div className="stat-value">0 / 20 ГБ</div>
|
||||||
|
<div className="stat-label">Объём хранилища</div>
|
||||||
|
<div className="progress-bar">
|
||||||
|
<div
|
||||||
|
className="progress-fill"
|
||||||
|
style={{ width: '50%' }}
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="stat-card">
|
||||||
|
<div className="stat-value">0</div>
|
||||||
|
<div className="stat-label">Токенов на балансе</div>
|
||||||
|
</div>
|
||||||
|
<div className="stat-card">
|
||||||
|
<div className="stat-value">ПРОФИ</div>
|
||||||
|
<div className="stat-label">Текущий план</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user