feat(web): authenticated home redesign + Telegram OAuth + SMTP

- AppLayout: logged-in desktop home redesigned — score cards, 4 section
  cards (Finance/Governance/Social/Education), governance extras, fixed
  bottom tab bar (Home/Citizen/Referral) matching mobile layout
- AppLayout: Trading dropdown in header (Presale/Staking/MultiSig),
  Logout button; removed 8-button grid
- Removed PalletsGrid and TokenomicsSection components
- Login: Telegram OAuth via oauth.telegram.org popup + postMessage +
  custom Edge Function (hash verification, find-or-create user,
  magic link token exchange)
- Login: X (Twitter) OAuth 2.0 wired to Supabase
- supabase/functions/telegram-auth: new Edge Function — verifies
  Telegram Login Widget hash, issues Supabase magic link token
- vite.config.ts: process-shim alias to fix TDZ with node polyfills
- i18n: updated locales (en/tr/kmr) for new UI sections
- SDK docs search index regenerated
This commit is contained in:
2026-05-01 10:10:40 +03:00
parent 709d408983
commit bac4148020
306 changed files with 2188 additions and 2367 deletions
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -90,7 +90,7 @@ const APP_SECTIONS: AppSection[] = [
{ title: 'mobile.app.events', icon: '📅', route: '/forum', comingSoon: true },
{ title: 'mobile.app.help', icon: '❓', route: '/help' },
{ title: 'mobile.app.music', icon: '🎵', route: '/forum', comingSoon: true },
{ title: 'mobile.app.vpn', icon: '🛡️', route: '/forum', comingSoon: true },
{ title: 'mobile.app.rewshenbir', icon: '📡', imgIcon: '/rewshenbir-icon.png', route: '/rewshenbir', href: 'https://rewshenbir.pezkuwi.app' },
{ title: 'mobile.app.referral', icon: '👥', route: '/dashboard', requiresAuth: true },
],
},
-166
View File
@@ -1,166 +0,0 @@
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Code, Database, TrendingUp, Gift, Award } from 'lucide-react';
interface Pallet {
id: string;
name: string;
icon: React.ReactNode;
description: string;
image: string;
extrinsics: string[];
storage: string[];
}
const pallets: Pallet[] = [
{
id: 'pez-treasury',
name: 'PEZ Treasury',
icon: <Database className="w-6 h-6" />,
description: 'Manages token distribution with 48-month synthetic halving mechanism',
image: 'https://d64gsuwffb70l.cloudfront.net/68ec477a0a2fa844d6f9df15_1760315321470_3d093f4f.webp',
extrinsics: ['initialize_treasury', 'release_monthly_funds', 'force_genesis_distribution'],
storage: ['HalvingInfo', 'MonthlyReleases', 'TreasuryStartBlock']
},
{
id: 'trust',
name: 'Trust Score',
icon: <TrendingUp className="w-6 h-6" />,
description: 'Calculates weighted trust scores from multiple components',
image: 'https://d64gsuwffb70l.cloudfront.net/68ec477a0a2fa844d6f9df15_1760315323202_06631fb8.webp',
extrinsics: ['force_recalculate_trust_score', 'update_all_trust_scores', 'periodic_trust_score_update'],
storage: ['TrustScores', 'TotalActiveTrustScore', 'BatchUpdateInProgress']
},
{
id: 'staking-score',
name: 'Staking Score',
icon: <Award className="w-6 h-6" />,
description: 'Time-based staking multipliers from 1.0x to 2.0x over 12 months',
image: 'https://d64gsuwffb70l.cloudfront.net/68ec477a0a2fa844d6f9df15_1760315324943_84216eda.webp',
extrinsics: ['start_score_tracking'],
storage: ['StakingStartBlock']
},
{
id: 'pez-rewards',
name: 'PEZ Rewards',
icon: <Gift className="w-6 h-6" />,
description: 'Monthly epoch-based reward distribution system',
image: 'https://d64gsuwffb70l.cloudfront.net/68ec477a0a2fa844d6f9df15_1760315326731_ca5f9a92.webp',
extrinsics: ['initialize_rewards_system', 'record_trust_score', 'finalize_epoch', 'claim_reward'],
storage: ['EpochInfo', 'EpochRewardPools', 'UserEpochScores', 'ClaimedRewards']
}
];
const PalletsGrid: React.FC = () => {
const { t } = useTranslation();
const [selectedPallet, setSelectedPallet] = useState<Pallet | null>(null);
return (
<section id="pallets" className="py-20 bg-gray-950">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-12">
<h2 className="text-4xl font-bold mb-4 bg-gradient-to-r from-purple-400 to-cyan-400 bg-clip-text text-transparent">
{t('palletsGrid.title')}
</h2>
<p className="text-gray-400 text-lg max-w-2xl mx-auto">
{t('palletsGrid.description')}
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{pallets.map((pallet) => (
<div
key={pallet.id}
onClick={() => setSelectedPallet(pallet)}
className="group relative bg-gray-900/50 backdrop-blur-sm rounded-xl border border-gray-800 hover:border-purple-500/50 transition-all cursor-pointer overflow-hidden"
>
{/* Background Glow */}
<div className="absolute inset-0 bg-gradient-to-br from-purple-900/20 to-cyan-900/20 opacity-0 group-hover:opacity-100 transition-opacity"></div>
<div className="relative p-6">
<div className="flex items-start space-x-4">
<img
src={pallet.image}
alt={pallet.name}
className="w-20 h-20 rounded-lg object-cover"
/>
<div className="flex-1">
<div className="flex items-center mb-2">
<div className="p-2 bg-gradient-to-br from-purple-600/20 to-cyan-600/20 rounded-lg mr-3">
{pallet.icon}
</div>
<h3 className="text-xl font-semibold text-white">{pallet.name}</h3>
</div>
<p className="text-gray-400 text-sm mb-4">{pallet.description}</p>
<div className="flex flex-wrap gap-2">
<span className="px-2 py-1 bg-kurdish-yellow/30 text-kurdish-yellow text-xs rounded-full">
{t('palletsGrid.extrinsics', { count: pallet.extrinsics.length })}
</span>
<span className="px-2 py-1 bg-cyan-900/30 text-cyan-400 text-xs rounded-full">
{t('palletsGrid.storageItems', { count: pallet.storage.length })}
</span>
</div>
</div>
</div>
</div>
</div>
))}
</div>
</div>
{/* Modal */}
{selectedPallet && (
<div
className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/70 backdrop-blur-sm"
onClick={() => setSelectedPallet(null)}
>
<div
className="bg-gray-900 rounded-xl border border-gray-700 max-w-2xl w-full max-h-[80vh] overflow-y-auto"
onClick={(e) => e.stopPropagation()}
>
<div className="p-6">
<div className="flex items-center justify-between mb-6">
<h3 className="text-2xl font-bold text-white">{selectedPallet.name}</h3>
<button
onClick={() => setSelectedPallet(null)}
className="text-gray-400 hover:text-white"
>
</button>
</div>
<div className="space-y-6">
<div>
<h4 className="text-lg font-semibold text-purple-400 mb-3">{t('palletsGrid.extrinsicsTitle')}</h4>
<div className="space-y-2">
{selectedPallet.extrinsics.map((ext) => (
<div key={ext} className="flex items-center p-3 bg-gray-800/50 rounded-lg">
<Code className="w-4 h-4 text-cyan-400 mr-3" />
<code className="text-gray-300 font-mono text-sm">{ext}()</code>
</div>
))}
</div>
</div>
<div>
<h4 className="text-lg font-semibold text-cyan-400 mb-3">{t('palletsGrid.storageTitle')}</h4>
<div className="space-y-2">
{selectedPallet.storage.map((item) => (
<div key={item} className="flex items-center p-3 bg-gray-800/50 rounded-lg">
<Database className="w-4 h-4 text-purple-400 mr-3" />
<code className="text-gray-300 font-mono text-sm">{item}</code>
</div>
))}
</div>
</div>
</div>
</div>
</div>
</div>
)}
</section>
);
};
export default PalletsGrid;
-181
View File
@@ -1,181 +0,0 @@
import React, { useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { PieChart, ArrowRightLeft } from 'lucide-react';
const TokenomicsSection: React.FC = () => {
const { t } = useTranslation();
const [selectedToken, setSelectedToken] = useState<'PEZ' | 'HEZ'>('PEZ');
const [monthsPassed] = useState(0);
const halvingPeriod = Math.floor(monthsPassed / 48);
//const _monthsUntilNextHalving = 48 - (monthsPassed % 48);
useEffect(() => {
const baseAmount = selectedToken === 'PEZ' ? 74218750 : 37109375;
// Calculate release amount for future use
const releaseAmount = baseAmount / Math.pow(2, halvingPeriod);
if (import.meta.env.DEV) console.log('Release amount:', releaseAmount);
}, [monthsPassed, halvingPeriod, selectedToken]);
const pezDistribution = [
{ name: t('tokenomics.treasury'), percentage: 96.25, amount: 4812500000, color: 'from-purple-500 to-purple-600' },
{ name: t('tokenomics.presale'), percentage: 1.875, amount: 93750000, color: 'from-cyan-500 to-cyan-600' },
{ name: t('tokenomics.founder'), percentage: 1.875, amount: 93750000, color: 'from-teal-500 to-teal-600' }
];
const hezDistribution = [
{ name: t('tokenomics.stakingRewards'), percentage: 40, amount: 1000000000, color: 'from-yellow-500 to-orange-600' },
{ name: t('tokenomics.governance'), percentage: 30, amount: 750000000, color: 'from-green-500 to-emerald-600' },
{ name: t('tokenomics.ecosystem'), percentage: 20, amount: 500000000, color: 'from-blue-500 to-indigo-600' },
{ name: t('tokenomics.team'), percentage: 10, amount: 250000000, color: 'from-red-500 to-pink-600' }
];
const distribution = selectedToken === 'PEZ' ? pezDistribution : hezDistribution;
const totalSupply = selectedToken === 'PEZ' ? 5000000000 : 2500000000;
const tokenColor = selectedToken === 'PEZ' ? 'purple' : 'yellow';
return (
<section id="tokenomics" className="py-20 bg-gray-900/50">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-12">
<h2 className="text-4xl font-bold mb-4 bg-gradient-to-r from-purple-400 to-yellow-400 bg-clip-text text-transparent">
{t('tokenomics.dualToken')}
</h2>
<p className="text-gray-400 text-lg max-w-2xl mx-auto mb-6">
{t('tokenomics.dualTokenDesc')}
</p>
{/* Token Selector */}
<div className="inline-flex bg-gray-950/50 rounded-lg p-1 border border-gray-800">
<button
onClick={() => setSelectedToken('PEZ')}
className={`px-6 py-2 rounded-md font-semibold transition-all ${
selectedToken === 'PEZ'
? 'bg-purple-600 text-white'
: 'text-gray-400 hover:text-white'
}`}
>
{t('tokenomics.pezToken')}
</button>
<button
onClick={() => setSelectedToken('HEZ')}
className={`px-6 py-2 rounded-md font-semibold transition-all ${
selectedToken === 'HEZ'
? 'bg-yellow-600 text-white'
: 'text-gray-400 hover:text-white'
}`}
>
{t('tokenomics.hezToken')}
</button>
</div>
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
{/* Distribution Chart */}
<div className="bg-gray-950/50 backdrop-blur-sm rounded-xl border border-gray-800 p-6">
<div className="flex items-center mb-6">
<PieChart className={`w-6 h-6 text-${tokenColor}-400 mr-3`} />
<h3 className="text-xl font-semibold text-white">{t('tokenomics.pezDistribution')}</h3>
</div>
<div className="flex justify-center mb-6">
<div className={`w-48 h-48 rounded-full bg-gradient-to-br from-${tokenColor}-500 to-${tokenColor}-700 flex items-center justify-center`}>
<span className="text-white text-3xl font-bold">{selectedToken}</span>
</div>
</div>
<div className="space-y-3">
{distribution.map((item) => (
<div key={item.name} className="flex items-center justify-between p-3 bg-gray-900/50 rounded-lg">
<div className="flex items-center">
<div className={`w-3 h-3 rounded-full bg-gradient-to-r ${item.color} mr-3`}></div>
<span className="text-gray-300">{item.name}</span>
</div>
<div className="text-right">
<div className="text-white font-semibold">{item.percentage}%</div>
<div className="text-gray-500 text-sm">{item.amount.toLocaleString()} {selectedToken}</div>
</div>
</div>
))}
</div>
<div className={`mt-6 p-4 bg-${tokenColor}-500/20 rounded-lg border border-${tokenColor}-500/30`}>
<div className="flex items-center justify-between">
<span className={`text-${tokenColor}-400`}>{t('tokenomics.totalSupply')}</span>
<span className="text-white font-bold">{totalSupply.toLocaleString()} {selectedToken}</span>
</div>
</div>
</div>
{/* Token Features */}
<div className="bg-gray-950/50 backdrop-blur-sm rounded-xl border border-gray-800 p-6">
<div className="flex items-center mb-6">
<ArrowRightLeft className={`w-6 h-6 text-${tokenColor}-400 mr-3`} />
<h3 className="text-xl font-semibold text-white">{t('tokenomics.hezFeatures')}</h3>
</div>
{selectedToken === 'PEZ' ? (
<div className="space-y-4">
<div className="p-4 bg-purple-900/20 rounded-lg border border-purple-500/30">
<h4 className="text-purple-400 font-semibold mb-2">{t('tokenomics.govToken')}</h4>
<p className="text-gray-300 text-sm">{t('tokenomics.govTokenDesc')}</p>
</div>
<div className="p-4 bg-purple-900/20 rounded-lg border border-purple-500/30">
<h4 className="text-purple-400 font-semibold mb-2">{t('tokenomics.stakingRewardsTitle')}</h4>
<p className="text-gray-300 text-sm">{t('tokenomics.stakingRewardsDesc')}</p>
</div>
<div className="p-4 bg-purple-900/20 rounded-lg border border-purple-500/30">
<h4 className="text-purple-400 font-semibold mb-2">{t('tokenomics.treasuryAccess')}</h4>
<p className="text-gray-300 text-sm">{t('tokenomics.treasuryAccessDesc')}</p>
</div>
<div className="p-4 bg-purple-900/20 rounded-lg border border-purple-500/30">
<h4 className="text-purple-400 font-semibold mb-2">{t('tokenomics.deflationary')}</h4>
<p className="text-gray-300 text-sm">{t('tokenomics.deflationaryDesc')}</p>
</div>
</div>
) : (
<div className="space-y-4">
<div className="p-4 bg-yellow-900/20 rounded-lg border border-yellow-500/30">
<h4 className="text-yellow-400 font-semibold mb-2">{t('tokenomics.utilityToken')}</h4>
<p className="text-gray-300 text-sm">{t('tokenomics.utilityTokenDesc')}</p>
</div>
<div className="p-4 bg-yellow-900/20 rounded-lg border border-yellow-500/30">
<h4 className="text-yellow-400 font-semibold mb-2">{t('tokenomics.p2pTrading')}</h4>
<p className="text-gray-300 text-sm">{t('tokenomics.p2pTradingDesc')}</p>
</div>
<div className="p-4 bg-yellow-900/20 rounded-lg border border-yellow-500/30">
<h4 className="text-yellow-400 font-semibold mb-2">{t('tokenomics.feeDiscounts')}</h4>
<p className="text-gray-300 text-sm">{t('tokenomics.feeDiscountsDesc')}</p>
</div>
<div className="p-4 bg-yellow-900/20 rounded-lg border border-yellow-500/30">
<h4 className="text-yellow-400 font-semibold mb-2">{t('tokenomics.rewardDistribution')}</h4>
<p className="text-gray-300 text-sm">{t('tokenomics.rewardDistributionDesc')}</p>
</div>
</div>
)}
<div className="mt-6 p-4 bg-gradient-to-r from-purple-900/20 to-yellow-900/20 rounded-lg border border-gray-700">
<h4 className="text-white font-semibold mb-3">{t('tokenomics.tokenSynergy')}</h4>
<div className="space-y-2 text-sm">
<div className="flex items-center text-gray-300">
<span className="w-2 h-2 bg-purple-400 rounded-full mr-2"></span>
{t('tokenomics.synergy1')}
</div>
<div className="flex items-center text-gray-300">
<span className="w-2 h-2 bg-yellow-400 rounded-full mr-2"></span>
{t('tokenomics.synergy2')}
</div>
<div className="flex items-center text-gray-300">
<span className="w-2 h-2 bg-green-400 rounded-full mr-2"></span>
{t('tokenomics.synergy3')}
</div>
</div>
</div>
</div>
</div>
</div>
</section>
);
};
export default TokenomicsSection;
File diff suppressed because it is too large Load Diff
+254 -159
View File
@@ -19,8 +19,8 @@
--fg-0: #f0f4f8;
--fg-1: #c8d4e0;
--fg-2: #8898aa;
--fg-3: #4a5568;
--fg-2: #8fa8be;
--fg-3: #6b7890;
--line: rgba(255,255,255,0.06);
--line-2: rgba(255,255,255,0.12);
@@ -72,9 +72,9 @@
/* ===== CONTAINER ===== */
.lp-container {
max-width: 1200px;
width: min(1440px, 92vw);
margin: 0 auto;
padding: 0 32px;
padding: 0 clamp(20px, 2.5vw, 56px);
}
/* ===== NAV ===== */
@@ -120,11 +120,11 @@
}
.lp-nav-link {
padding: 6px 12px; border-radius: 6px;
font-size: 14px; font-weight: 500; color: var(--fg-2);
font-size: 14px; font-weight: 500; color: var(--fg-1);
text-decoration: none; transition: color 0.15s, background 0.15s;
white-space: nowrap;
}
.lp-nav-link:hover { color: var(--fg-0); background: var(--line); }
.lp-nav-link:hover { color: var(--fg-0); background: var(--line-2); }
.lp-nav-actions {
display: flex; align-items: center; gap: 10px; flex-shrink: 0;
}
@@ -155,6 +155,69 @@
}
.lp-btn-citizen:hover { background: var(--kurd-green-2); transform: translateY(-1px); }
/* Wallet button */
.lp-wallet-connected { display: flex; align-items: center; gap: 2px; }
.lp-btn-wallet {
padding: 7px 14px; border-radius: 8px;
font-size: 13px; font-weight: 600;
border: 1.5px solid transparent; cursor: pointer;
display: inline-flex; align-items: center; gap: 7px;
transition: all 0.15s; white-space: nowrap;
}
.lp-btn-wallet--off {
background: color-mix(in oklab, var(--kurd-red) 15%, transparent);
color: var(--kurd-red);
border-color: color-mix(in oklab, var(--kurd-red) 35%, transparent);
}
.lp-btn-wallet--off:hover {
background: color-mix(in oklab, var(--kurd-red) 25%, transparent);
border-color: var(--kurd-red);
}
.lp-btn-wallet--on {
background: color-mix(in oklab, var(--kurd-green) 20%, transparent);
color: var(--kurd-green-2);
border-color: color-mix(in oklab, var(--kurd-green) 50%, transparent);
box-shadow: 0 0 8px -2px color-mix(in oklab, var(--kurd-green) 30%, transparent);
}
.lp-btn-wallet--on:hover {
background: color-mix(in oklab, var(--kurd-green) 28%, transparent);
border-color: var(--kurd-green);
}
.lp-wallet-dot {
width: 7px; height: 7px; border-radius: 50%;
background: var(--kurd-green);
box-shadow: 0 0 6px var(--kurd-green);
animation: lp-pulse 2.4s ease-in-out infinite;
flex-shrink: 0;
}
.lp-wallet-name { max-width: 100px; overflow: hidden; text-overflow: ellipsis; }
.lp-btn-wallet-dc {
padding: 6px 9px; border-radius: 8px;
background: color-mix(in oklab, var(--kurd-red) 12%, transparent);
color: var(--kurd-red-2);
border: 1.5px solid color-mix(in oklab, var(--kurd-red) 30%, transparent);
cursor: pointer;
display: inline-flex; align-items: center;
transition: all 0.15s;
title: "Disconnect wallet";
}
.lp-btn-wallet-dc:hover {
background: color-mix(in oklab, var(--kurd-red) 22%, transparent);
border-color: var(--kurd-red);
color: #fff;
transform: scale(1.05);
}
/* Login button */
.lp-btn-login {
padding: 7px 16px; border-radius: 8px;
background: transparent; color: var(--fg-2);
font-size: 13px; font-weight: 500;
border: 1.5px solid var(--line-2); cursor: pointer;
transition: all 0.15s; white-space: nowrap;
}
.lp-btn-login:hover { color: var(--fg-0); border-color: var(--fg-3); background: var(--line); }
/* ===== SECTION COMMON ===== */
.lp-section { padding: 120px 0; }
.lp-section-head {
@@ -261,87 +324,48 @@
.lp-sun-bg {
position: absolute; inset: 0;
background: conic-gradient(
from 0deg,
color-mix(in oklab, var(--kurd-yellow) 8%, transparent) 0deg,
transparent 15deg,
color-mix(in oklab, var(--kurd-red) 6%, transparent) 60deg,
transparent 75deg,
color-mix(in oklab, var(--kurd-green) 8%, transparent) 120deg,
transparent 135deg,
color-mix(in oklab, var(--kurd-yellow) 6%, transparent) 180deg,
transparent 195deg,
color-mix(in oklab, var(--kurd-red) 5%, transparent) 240deg,
transparent 255deg,
color-mix(in oklab, var(--kurd-green) 6%, transparent) 300deg,
transparent 315deg,
color-mix(in oklab, var(--kurd-yellow) 5%, transparent) 340deg,
transparent 360deg
from 0deg at 50% 60%,
transparent 0 35%,
color-mix(in oklab, var(--kurd-yellow) 14%, transparent) 35% 38%,
transparent 38% 41%,
color-mix(in oklab, var(--kurd-yellow) 14%, transparent) 41% 44%,
transparent 44% 100%
);
animation: lp-spin 80s linear infinite;
opacity: 0.6;
}
.lp-sun-rings {
position: absolute;
width: 72%; aspect-ratio: 1;
border-radius: 50%;
border: 1px solid color-mix(in oklab, var(--kurd-yellow) 20%, transparent);
box-shadow:
0 0 0 12px color-mix(in oklab, var(--kurd-yellow) 6%, transparent),
0 0 0 28px color-mix(in oklab, var(--kurd-green) 4%, transparent),
0 0 0 50px color-mix(in oklab, var(--kurd-red) 3%, transparent);
animation: lp-orbit 60s linear infinite;
}
@keyframes lp-orbit {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
@keyframes lp-spin {
to { transform: rotate(360deg); }
}
.lp-sun-disc {
position: absolute;
width: 42%; aspect-ratio: 1;
left: 50%; top: 60%;
width: 44%; aspect-ratio: 1;
transform: translate(-50%, -50%);
border-radius: 50%;
background: conic-gradient(
from 0deg,
var(--kurd-yellow) 0deg, var(--kurd-yellow-2) 17.14deg,
var(--kurd-red) 17.14deg, var(--kurd-red-2) 34.28deg,
var(--kurd-yellow) 34.28deg, var(--kurd-yellow-2) 51.42deg,
var(--kurd-red) 51.42deg, var(--kurd-red-2) 68.56deg,
var(--kurd-yellow) 68.56deg, var(--kurd-yellow-2) 85.70deg,
var(--kurd-red) 85.70deg, var(--kurd-red-2) 102.84deg,
var(--kurd-yellow) 102.84deg, var(--kurd-yellow-2) 120deg,
var(--kurd-red) 120deg, var(--kurd-red-2) 137.14deg,
var(--kurd-yellow) 137.14deg, var(--kurd-yellow-2) 154.28deg,
var(--kurd-red) 154.28deg, var(--kurd-red-2) 171.42deg,
var(--kurd-yellow) 171.42deg, var(--kurd-yellow-2) 188.56deg,
var(--kurd-red) 188.56deg, var(--kurd-red-2) 205.70deg,
var(--kurd-yellow) 205.70deg, var(--kurd-yellow-2) 222.84deg,
var(--kurd-red) 222.84deg, var(--kurd-red-2) 240deg,
var(--kurd-yellow) 240deg, var(--kurd-yellow-2) 257.14deg,
var(--kurd-red) 257.14deg, var(--kurd-red-2) 274.28deg,
var(--kurd-yellow) 274.28deg, var(--kurd-yellow-2) 291.42deg,
var(--kurd-red) 291.42deg, var(--kurd-red-2) 308.56deg,
var(--kurd-yellow) 308.56deg, var(--kurd-yellow-2) 325.70deg,
var(--kurd-red) 325.70deg, var(--kurd-red-2) 342.84deg,
var(--kurd-yellow) 342.84deg, var(--kurd-yellow-2) 360deg
);
animation: lp-spin 24s linear infinite;
box-shadow:
0 0 0 4px var(--bg-0),
0 0 24px color-mix(in oklab, var(--kurd-yellow) 50%, transparent);
background: radial-gradient(circle, var(--kurd-yellow) 0%, var(--kurd-red) 70%);
box-shadow: 0 0 80px color-mix(in oklab, var(--kurd-yellow) 50%, transparent);
filter: blur(0.5px);
}
@keyframes lp-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.lp-sun-disc::after {
content: ""; position: absolute; inset: 18%;
.lp-sun-rings {
position: absolute; inset: 20px;
border: 1px dashed color-mix(in oklab, var(--fg-2) 40%, transparent);
border-radius: 50%;
animation: lp-orbit 60s linear infinite reverse;
}
@keyframes lp-orbit {
to { transform: rotate(360deg); }
}
.lp-sun-rings::before {
content: ""; position: absolute; inset: 36px;
border: 1px dashed color-mix(in oklab, var(--fg-2) 30%, transparent);
border-radius: 50%;
background: var(--bg-0);
box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--kurd-yellow) 30%, transparent);
}
.lp-hero-side-meta {
position: absolute; bottom: 20px; left: 0; right: 0;
text-align: center;
font-family: var(--font-mono); font-size: 10.5px;
color: var(--fg-3); letter-spacing: 0.06em;
display: flex; justify-content: center; gap: 16px;
position: absolute; bottom: 20px; left: 20px; right: 20px;
display: flex; justify-content: space-between;
font-family: var(--font-mono); font-size: 11px; color: var(--fg-2);
letter-spacing: 0.08em;
}
/* ===== HERO STATBAR ===== */
@@ -361,10 +385,10 @@
display: flex; align-items: center; gap: 8px;
font-family: var(--font-mono); font-size: 10px;
text-transform: uppercase; letter-spacing: 0.1em;
color: var(--fg-3); margin-bottom: 10px;
color: var(--fg-2); margin-bottom: 10px;
}
.lp-stat-head .ico {
width: 18px; height: 18px; color: var(--fg-3); flex-shrink: 0;
width: 18px; height: 18px; color: var(--fg-2); flex-shrink: 0;
}
.lp-stat-head .ico svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; }
.lp-stat-val {
@@ -372,10 +396,10 @@
color: var(--fg-0); line-height: 1.1;
}
.lp-stat-meta {
font-size: 11px; color: var(--fg-3);
font-size: 11px; color: var(--fg-2);
font-family: var(--font-mono); margin-top: 4px;
}
.lp-stat-hash { font-size: 10px; color: var(--fg-3); letter-spacing: 0.04em; }
.lp-stat-hash { font-size: 10px; color: var(--fg-2); letter-spacing: 0.04em; }
.lp-conn-pill {
display: inline-flex; align-items: center; gap: 6px;
padding: 4px 10px; border-radius: 99px;
@@ -469,11 +493,11 @@
/* ===== TICKER ===== */
.lp-ticker-band {
border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line);
background: var(--bg-1);
border-top: 1px solid var(--line-2);
border-bottom: 1px solid var(--line-2);
background: var(--bg-2);
overflow: hidden;
height: 36px; display: flex; align-items: center;
height: 38px; display: flex; align-items: center;
}
.lp-ticker {
display: flex; align-items: center; gap: 0;
@@ -487,14 +511,15 @@
.lp-ticker-item {
display: inline-flex; align-items: center; gap: 8px;
padding: 0 20px;
font-family: var(--font-mono); font-size: 11px;
font-family: var(--font-mono); font-size: 11.5px;
}
.lp-ticker-item .label { color: var(--fg-3); text-transform: uppercase; letter-spacing: 0.08em; }
.lp-ticker-item .val { color: var(--fg-1); font-weight: 600; }
.lp-ticker-item .up { color: var(--kurd-green); }
.lp-ticker-item .dn { color: var(--kurd-red); }
.lp-ticker-item .label { color: var(--fg-2); text-transform: uppercase; letter-spacing: 0.1em; font-size: 10px; }
.lp-ticker-item .val { color: var(--fg-0); font-weight: 700; }
.lp-ticker-item .up { color: var(--kurd-green-2); }
.lp-ticker-item .dn { color: var(--kurd-red-2); }
.lp-ticker-sep {
width: 1px; height: 16px; background: var(--line-2);
width: 1px; height: 18px;
background: color-mix(in oklab, var(--fg-3) 50%, transparent);
flex-shrink: 0;
}
@@ -520,7 +545,7 @@
.lp-stat-cell .label {
font-family: var(--font-mono); font-size: 11px;
text-transform: uppercase; letter-spacing: 0.1em;
color: var(--fg-3); margin-bottom: 12px;
color: var(--fg-2); margin-bottom: 12px;
}
.lp-stat-cell .val {
font-family: var(--font-mono); font-size: 40px; font-weight: 700;
@@ -528,106 +553,126 @@
margin-bottom: 8px;
}
.lp-stat-cell .val .unit { font-size: 22px; color: var(--fg-3); }
.lp-stat-cell .meta { font-size: 12px; color: var(--fg-3); }
.lp-stat-cell .meta { font-size: 12px; color: var(--fg-2); }
.lp-stat-cell .meta .up { color: var(--kurd-green-2); }
/* ===== FEATURES ===== */
.lp-features-grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 16px;
gap: 20px;
}
.lp-feat-card {
background: var(--bg-1); border: 1px solid var(--line);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
padding: 36px 32px;
background: var(--bg-1);
padding: 32px;
position: relative; overflow: hidden;
transition: border-color 0.25s;
display: flex; flex-direction: column;
transition: transform 0.3s ease, border-color 0.3s ease;
}
.lp-feat-card:hover { border-color: var(--line-2); }
.lp-feat-card:hover { transform: translateY(-4px); border-color: var(--line-2); }
.lp-feat-card.span-7 { grid-column: span 7; }
.lp-feat-card.span-5 { grid-column: span 5; }
.lp-feat-card.featured {
background: linear-gradient(160deg, var(--bg-1), color-mix(in oklab, var(--kurd-green) 4%, var(--bg-1)));
background:
radial-gradient(ellipse 60% 80% at 100% 0%, color-mix(in oklab, var(--kurd-green) 16%, transparent), transparent 60%),
var(--bg-1);
}
.lp-feat-eyebrow {
font-family: var(--font-mono); font-size: 11px;
color: var(--fg-3); letter-spacing: 0.12em;
text-transform: uppercase; margin-bottom: 16px;
color: var(--fg-2); letter-spacing: 0.14em;
text-transform: uppercase; margin-bottom: 32px;
display: flex; align-items: center; gap: 8px;
}
.lp-feat-eyebrow .num { color: var(--kurd-green-2); font-weight: 700; }
.lp-feat-eyebrow .num { color: var(--fg-0); font-weight: 700; }
.lp-feat-card h3 {
font-size: 22px; font-weight: 600; letter-spacing: -0.02em;
color: var(--fg-0); margin: 0 0 12px; line-height: 1.3;
font-size: 28px; line-height: 1.1; letter-spacing: -0.02em;
font-weight: 600; color: var(--fg-0); margin: 0 0 12px; max-width: 360px;
}
.lp-feat-card.featured h3 { font-size: 38px; max-width: 560px; }
.lp-feat-card p {
font-size: 14px; color: var(--fg-2); line-height: 1.65; margin: 0 0 20px; flex: 1;
font-size: 14px; color: var(--fg-2); line-height: 1.55; margin: 0 0 24px; max-width: 380px;
}
.lp-feat-link {
font-size: 13px; color: var(--kurd-green-2);
text-decoration: none; font-weight: 500;
transition: color 0.15s;
color: var(--fg-0); font-size: 14px; text-decoration: none; font-weight: 500;
display: inline-flex; align-items: center; gap: 6px;
border-bottom: 1px solid var(--fg-3); padding-bottom: 2px;
transition: gap 0.2s, border-color 0.2s;
background: none; border-top: none; border-left: none; border-right: none;
cursor: pointer;
}
.lp-feat-link:hover { color: var(--fg-0); }
.lp-feat-link:hover { gap: 10px; border-color: var(--fg-0); }
/* CSS Artworks */
/* Feature artwork — block panel below content */
.lp-art {
position: absolute; right: 24px; bottom: 24px;
opacity: 0.5; transition: opacity 0.25s;
pointer-events: none;
margin-top: 32px; height: 140px;
border-radius: var(--radius-md);
background: var(--bg-2); border: 1px solid var(--line);
position: relative; overflow: hidden;
}
.lp-feat-card:hover .lp-art { opacity: 0.8; }
.lp-feat-card.featured .lp-art { height: 220px; }
/* Vote bars */
.lp-art-vote {
display: flex; align-items: flex-end; gap: 5px;
height: 64px;
position: absolute; inset: 0;
display: flex; align-items: flex-end; gap: 4px; padding: 16px;
}
.lp-art-vote span {
width: 8px; background: var(--kurd-green);
border-radius: 2px 2px 0 0; flex-shrink: 0;
flex: 1; border-radius: 4px 4px 0 0;
background: linear-gradient(to top, var(--kurd-green), color-mix(in oklab, var(--kurd-green) 50%, transparent));
}
.lp-art-vote span:nth-child(3n+2) {
background: linear-gradient(to top, var(--kurd-yellow), color-mix(in oklab, var(--kurd-yellow) 50%, transparent));
}
.lp-art-vote span:nth-child(3n+3) {
background: linear-gradient(to top, var(--kurd-red), color-mix(in oklab, var(--kurd-red) 50%, transparent));
}
/* Citizen pixel grid */
.lp-art-citizen {
display: grid; grid-template-columns: repeat(8, 1fr); gap: 4px;
width: 120px;
position: absolute; inset: 0;
display: grid; grid-template-columns: repeat(8, 1fr); grid-auto-rows: 1fr;
gap: 3px; padding: 12px;
}
.lp-art-citizen span {
width: 12px; height: 12px; border-radius: 3px;
background: var(--line-2);
}
.lp-art-citizen span.on1 { background: var(--kurd-green); opacity: 0.6; }
.lp-art-citizen span.on2 { background: var(--kurd-yellow); opacity: 0.6; }
.lp-art-citizen span.on3 { background: var(--kurd-red); opacity: 0.6; }
.lp-art-citizen span { background: var(--bg-3); border-radius: 3px; }
.lp-art-citizen span.on1 { background: var(--kurd-green); }
.lp-art-citizen span.on2 { background: var(--kurd-yellow); }
.lp-art-citizen span.on3 { background: var(--kurd-red); }
/* Trade wave */
.lp-art-trade {
width: 120px; height: 48px; overflow: hidden;
position: absolute; inset: 0;
display: flex; align-items: center; justify-content: center;
}
.lp-art-trade-wave {
width: 200%; height: 100%;
background: repeating-linear-gradient(
90deg,
transparent, transparent 4px,
var(--kurd-green) 4px, var(--kurd-green) 5px
);
clip-path: polygon(0 70%, 5% 55%, 10% 45%, 15% 30%, 20% 20%, 25% 15%, 30% 22%, 35% 38%, 40% 50%, 45% 42%, 50% 28%, 55% 18%, 60% 25%, 65% 40%, 70% 55%, 75% 48%, 80% 35%, 85% 22%, 90% 32%, 95% 50%, 100% 60%, 100% 100%, 0 100%);
opacity: 0.5;
position: absolute; inset: 0;
background-image:
linear-gradient(to right,
transparent 0%,
color-mix(in oklab, var(--kurd-green) 40%, transparent) 25%,
transparent 50%,
color-mix(in oklab, var(--kurd-red) 40%, transparent) 75%,
transparent 100%);
clip-path: polygon(0 70%, 5% 50%, 10% 40%, 15% 28%, 20% 18%, 25% 14%, 30% 20%, 35% 36%, 40% 50%, 45% 40%, 50% 26%, 55% 16%, 60% 24%, 65% 38%, 70% 52%, 75% 45%, 80% 32%, 85% 20%, 90% 30%, 95% 48%, 100% 58%, 100% 100%, 0 100%);
}
/* Validator bar chart */
.lp-art-validator {
display: flex; gap: 16px; align-items: flex-start;
position: absolute; inset: 0;
display: flex; align-items: center; justify-content: space-between;
padding: 16px 20px;
}
.lp-art-validator .col { display: flex; flex-direction: column; gap: 6px; }
.lp-art-validator .row {
height: 8px; border-radius: 4px;
background: var(--kurd-green); opacity: 0.5;
width: var(--w, 80%);
background: linear-gradient(90deg,
var(--kurd-green) 0%, var(--kurd-green) var(--w, 80%),
var(--bg-3) var(--w, 80%), var(--bg-3) 100%);
width: 140px;
}
.lp-art-validator .col:last-child {
font-family: var(--font-mono); font-size: 9px;
color: var(--fg-3); display: flex; flex-direction: column;
gap: 6px; padding-top: 0;
color: var(--fg-3); text-align: right; gap: 8px;
}
.lp-art-validator .col:last-child div { line-height: 8px; }
@@ -644,17 +689,33 @@
}
.lp-arch-chain {
border: 1px solid var(--line);
border-top: 3px solid var(--chain-accent, var(--line-2));
border-radius: var(--radius-lg);
padding: 28px 24px;
background: var(--bg-2);
transition: border-color 0.2s;
transition: border-color 0.2s, box-shadow 0.2s;
}
.lp-arch-chain:hover {
border-color: var(--chain-accent, var(--line-2));
box-shadow: 0 8px 32px -8px color-mix(in oklab, var(--chain-accent, var(--bg-0)) 20%, transparent);
}
.lp-arch-chain:nth-child(1) { --chain-accent: var(--kurd-green); }
.lp-arch-chain:nth-child(2) { --chain-accent: var(--kurd-yellow); }
.lp-arch-chain:nth-child(3) { --chain-accent: var(--kurd-red); }
.lp-chain-dot {
width: 7px; height: 7px; border-radius: 50%;
background: var(--chain-accent, var(--fg-2));
box-shadow: 0 0 5px var(--chain-accent, transparent);
flex-shrink: 0;
}
.lp-arch-chain:hover { border-color: var(--line-2); }
.lp-chain-tag {
display: flex; align-items: center; gap: 8px;
font-family: var(--font-mono); font-size: 10.5px;
color: var(--fg-3); margin-bottom: 16px;
letter-spacing: 0.06em;
display: inline-flex; align-items: center; gap: 7px;
font-family: var(--font-mono); font-size: 11px;
font-weight: 600; letter-spacing: 0.08em;
color: var(--fg-1); margin-bottom: 16px;
padding: 4px 10px; border-radius: 99px;
background: var(--bg-3);
border: 1px solid var(--line-2);
}
.lp-arch-chain h4 {
font-size: 18px; font-weight: 600; letter-spacing: -0.02em;
@@ -667,7 +728,7 @@
display: flex; gap: 16px; flex-wrap: wrap;
font-family: var(--font-mono); font-size: 11px;
}
.lp-chain-stats .k { color: var(--fg-3); display: block; margin-bottom: 2px; }
.lp-chain-stats .k { color: var(--fg-2); display: block; margin-bottom: 2px; font-size: 10px; }
.lp-chain-stats .v { color: var(--fg-0); font-weight: 700; font-size: 14px; }
.lp-chain-stats > div { display: flex; flex-direction: column; }
@@ -706,7 +767,7 @@
background: var(--bg-1); padding: 16px 18px;
display: flex; flex-direction: column; gap: 4px;
}
.lp-tok-meta .k { font-size: 10.5px; color: var(--fg-3); font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.08em; }
.lp-tok-meta .k { font-size: 10.5px; color: var(--fg-2); font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.08em; }
.lp-tok-meta .v { font-size: 15px; color: var(--fg-0); font-weight: 600; }
.lp-tok-meta .v.italic { font-family: var(--font-display); font-style: italic; }
.lp-tok-row {
@@ -718,7 +779,7 @@
.lp-tok-row .swatch { width: 10px; height: 10px; border-radius: 3px; flex-shrink: 0; }
.lp-tok-row .name { flex: 1; color: var(--fg-1); }
.lp-tok-row .pct { font-family: var(--font-mono); font-weight: 700; color: var(--fg-0); font-size: 13px; }
.lp-tok-row .amt { font-family: var(--font-mono); font-size: 11px; color: var(--fg-3); min-width: 90px; text-align: right; }
.lp-tok-row .amt { font-family: var(--font-mono); font-size: 11px; color: var(--fg-2); min-width: 90px; text-align: right; }
.lp-tok-chart {
position: relative; display: flex;
align-items: center; justify-content: center;
@@ -733,7 +794,7 @@
font-weight: 700; color: var(--fg-0);
}
.lp-tok-chart .clabel {
font-size: 11px; color: var(--fg-3);
font-size: 11px; color: var(--fg-2);
font-family: var(--font-mono); text-transform: uppercase;
letter-spacing: 0.1em;
}
@@ -844,7 +905,7 @@
.lp-services-block h4 {
font-family: var(--font-mono); font-size: 10px;
text-transform: uppercase; letter-spacing: 0.16em;
color: var(--fg-3); margin: 0 0 20px;
color: var(--fg-2); margin: 0 0 20px;
}
.lp-services-grid {
display: flex; flex-wrap: wrap; justify-content: center; gap: 8px;
@@ -853,17 +914,25 @@
display: inline-flex; align-items: center; gap: 8px;
padding: 8px 16px; border-radius: 8px;
border: 1px solid var(--line-2);
color: var(--fg-2); text-decoration: none;
color: var(--fg-1); text-decoration: none;
font-size: 13px; font-weight: 500;
transition: all 0.18s;
background: color-mix(in oklab, var(--bg-2) 80%, transparent);
}
.lp-service-link:hover {
color: var(--fg-0);
border-color: color-mix(in oklab, var(--kurd-green) 35%, var(--line-2));
border-color: color-mix(in oklab, var(--kurd-green) 45%, var(--line-2));
background: var(--bg-2);
}
.lp-service-link svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 1.6; stroke-linecap: round; flex-shrink: 0; }
.lp-login-badge {
font-size: 9px; font-weight: 700; letter-spacing: 0.06em;
padding: 2px 5px; border-radius: 4px;
background: color-mix(in oklab, var(--kurd-yellow) 18%, transparent);
color: var(--kurd-yellow-2);
border: 1px solid color-mix(in oklab, var(--kurd-yellow) 35%, transparent);
text-transform: uppercase;
}
/* ===== PALLET GRID ===== */
.lp-pallet-grid {
@@ -903,7 +972,7 @@
border: 1px solid color-mix(in oklab, var(--p-accent, var(--kurd-green)) 35%, transparent);
}
.lp-pallet-count {
font-family: var(--font-mono); font-size: 11px; color: var(--fg-3); letter-spacing: 0.1em;
font-family: var(--font-mono); font-size: 11px; color: var(--fg-2); letter-spacing: 0.1em;
}
.lp-pallet-count b { color: var(--p-accent); }
.lp-pallet-items {
@@ -958,7 +1027,7 @@
.lp-foot-col h5 {
font-family: var(--font-mono); font-size: 11px;
text-transform: uppercase; letter-spacing: 0.14em;
color: var(--fg-3); margin: 0 0 18px; font-weight: 500;
color: var(--fg-2); margin: 0 0 18px; font-weight: 600;
}
.lp-foot-col ul { list-style: none; padding: 0; margin: 0; }
.lp-foot-col li { margin-bottom: 10px; }
@@ -966,8 +1035,8 @@
.lp-foot-col a:hover { color: var(--fg-0); }
.lp-foot-bottom {
display: flex; justify-content: space-between; align-items: center;
padding-top: 32px; border-top: 1px solid var(--line);
font-family: var(--font-mono); font-size: 11px; color: var(--fg-3);
padding-top: 32px; border-top: 1px solid var(--line-2);
font-family: var(--font-mono); font-size: 11px; color: var(--fg-2);
text-transform: uppercase; letter-spacing: 0.1em;
}
.lp-foot-flag {
@@ -982,6 +1051,32 @@
border-radius: 50%; background: var(--kurd-yellow);
box-shadow: 0 0 6px color-mix(in oklab, var(--kurd-yellow) 60%, transparent);
}
.lp-wallet-error {
position: absolute;
top: calc(100% + 6px);
left: 50%;
transform: translateX(-50%);
background: color-mix(in oklab, var(--kurd-red) 15%, var(--bg-2));
border: 1px solid color-mix(in oklab, var(--kurd-red) 40%, transparent);
color: var(--kurd-red-2);
font-size: 11px;
padding: 6px 10px;
border-radius: 8px;
white-space: nowrap;
max-width: 260px;
white-space: normal;
text-align: center;
z-index: 100;
pointer-events: none;
}
.lp-foot-kurdish-text {
background: linear-gradient(to right, var(--kurd-green), var(--kurd-yellow), var(--kurd-red));
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
}
/* ===== REVEAL ANIMATIONS ===== */
.lp-reveal { opacity: 0; transform: translateY(24px); transition: opacity 0.8s ease, transform 0.8s ease; }
-1
View File
@@ -3908,7 +3908,6 @@ export default {
'taxZekat.success': 'تم إرسال {{amount}} HEZ بنجاح. شكراً!',
// Messaging
'messaging.palletNotReady': 'حزمة المراسلة غير متاحة بعد على People Chain. يلزم تحديث وقت التشغيل.',
// KurdMedia page
'kurdMedia.title': 'KurdMedia',
-1
View File
@@ -3898,7 +3898,6 @@ export default {
'taxZekat.success': '{{amount}} HEZ بە سەرکەوتوویی نێردرا. سوپاس!',
// Messaging
'messaging.palletNotReady': 'پاڵێتی پەیامگێڕی هێشتا لەسەر People Chain بەردەست نییە. نوێکردنەوەی ڕانتایم پێویستە.',
// KurdMedia page
'kurdMedia.title': 'KurdMedia',
+213 -1
View File
@@ -3856,6 +3856,7 @@ export default {
'mobile.app.help': 'Help',
'mobile.app.music': 'Music',
'mobile.app.vpn': 'VPN',
'mobile.app.rewshenbir': 'Rewshenbir',
'mobile.app.referral': 'Referral',
'mobile.app.university': 'University',
'mobile.app.perwerde': 'Perwerde',
@@ -3960,7 +3961,6 @@ export default {
'taxZekat.success': '{{amount}} HEZ sent successfully. Thank you!',
// Messaging
'messaging.palletNotReady': 'Messaging pallet is not yet available on People Chain. A runtime upgrade is required.',
// KurdMedia page
'kurdMedia.title': 'KurdMedia',
@@ -4040,4 +4040,216 @@ export default {
'research.submit.title': 'Lêkolîna xwe bişînin / Submit your research',
'research.submit.desc': 'Hûn dikarin gotarên xwe yên zanistî ji bo vekolînê bişînin. Submit your academic papers for peer review.',
'research.submit.btn': 'Bişîne / Submit',
// ─── Landing Page ────────────────────────────────────────────────────────────
// Nav
'landing.nav.network': 'Network',
'landing.nav.governance': 'Governance',
'landing.nav.trading': 'Trading',
'landing.nav.citizens': 'Citizens',
'landing.nav.docs': 'Docs',
'landing.nav.mainnet': 'Mainnet',
'landing.nav.connectWallet': 'Connect Wallet',
'landing.nav.login': 'Login',
'landing.nav.peers': 'peers',
// Hero
'landing.hero.badge': 'Digital Kurdistan State · Now in Mainnet',
'landing.hero.badgeVersion': 'v1.0',
'landing.hero.h1part1': 'A sovereign chain',
'landing.hero.h1part2': 'for a',
'landing.hero.h1accent': 'borderless',
'landing.hero.h1part3': 'nation.',
'landing.hero.sub': 'PezkuwiChain is a public, permissionless blockchain — built first for the Kurdish nation, and for every stateless people and cultural nation across the world. Democratic proposals, transparent treasury, and on-chain identity for citizens, wherever they live.',
'landing.hero.cta.explore': 'Explore the network →',
'landing.hero.cta.whitepaper': 'Read whitepaper',
'landing.hero.sun.name': 'Roj · the sun of Kurdistan',
'landing.hero.sun.rays': '21 rays · ↻ since 1932',
// Hero stat bar
'landing.statbar.network': 'Network',
'landing.statbar.connected': 'Connected',
'landing.statbar.latestBlock': 'Latest Block',
'landing.statbar.finalized': 'Finalized',
'landing.statbar.finalizedMeta': '~2 blocks behind',
'landing.statbar.validators': 'Validators',
'landing.statbar.validatorsMeta': 'Validating blocks',
'landing.statbar.collators': 'Collators',
'landing.statbar.collatorsMeta': 'Producing blocks',
'landing.statbar.nominators': 'Nominators',
'landing.statbar.nominatorsMeta': 'Staking to validators',
// Ticker
'landing.ticker.block': 'block',
'landing.ticker.validators': 'validators',
'landing.ticker.nominators': 'nominators',
'landing.ticker.citizens': 'citizens',
'landing.ticker.staked': 'staked',
'landing.ticker.proposals': 'proposals',
'landing.ticker.peers': 'peers',
// Section 01 Live network
'landing.network.eyebrow': '// 01 · Live network',
'landing.network.h2': 'Numbers that',
'landing.network.h2em': 'govern themselves.',
'landing.network.p': 'Every metric below is fetched directly from the relay chain — what the validators see, you see.',
'landing.network.activeProposals': 'Active proposals',
'landing.network.proposalsMeta': '↗ governance live',
'landing.network.totalVoters': 'Total voters',
'landing.network.votersMeta': 'conviction voting',
'landing.network.tokensStaked': 'Tokens staked',
'landing.network.stakedMeta': 'of total supply',
'landing.network.citizens': 'Citizens worldwide',
'landing.network.citizensMeta': 'across 187 countries',
// Section 02 Features
'landing.features.eyebrow': '// 02 · What you can do',
'landing.features.h2': 'One chain, every',
'landing.features.h2em': 'civic primitive.',
'landing.features.p': 'An independent Layer 1 — originally forked from Polkadot, now a fully sovereign codebase with its own crates, npm packages, and pallets for governance, identity, treasury, and trade.',
'landing.features.01.eyebrow': '01 · Governance',
'landing.features.01.h3': 'Vote on the rules that govern the network — and the nation.',
'landing.features.01.p': 'OpenGov-style referenda with conviction voting, delegation, and a 7-day decision period. Every citizen can propose; every proposal is on-chain forever.',
'landing.features.01.link': 'Open governance dashboard →',
'landing.features.02.eyebrow': '02 · Citizenship',
'landing.features.02.h3': 'Your identity, signed by the state.',
'landing.features.02.p': 'Soulbound NFT on the People Chain. Trust score, verified attributes, voting weight — issued once, owned forever.',
'landing.features.02.link': 'Become a citizen →',
'landing.features.03.eyebrow': '03 · Economy',
'landing.features.03.h3': 'Trade, lend, and fund the nation in HEZ.',
'landing.features.03.p': 'DEX pools on Asset Hub, escrow-backed P2P, and a treasury funding grants and infrastructure — all governed on-chain.',
'landing.features.03.link': 'Open economy →',
'landing.features.04.eyebrow': '04 · Validators',
'landing.features.04.p': 'Nominated Proof-of-Stake secures every block. Stake HEZ to back a validator, or run your own node and earn rewards while defending the chain.',
'landing.features.04.h3suffix': 'nodes. 12 nations. Zero downtime since genesis.',
'landing.features.04.link': 'Run a node →',
// Section 03 Architecture
'landing.arch.eyebrow': '// 03 · Architecture',
'landing.arch.h2': 'Three chains,',
'landing.arch.h2em': 'one nation.',
'landing.arch.p': 'Three independent chains, fully owned by the network. Every pallet, crate, and package is PezkuwiChain\'s own — governance, identity, treasury, and trade, all designed for a digital nation.',
'landing.arch.rc.tag': 'Pezkuwi RC · Relay Chain',
'landing.arch.rc.h4': 'Pezkuwi Relay',
'landing.arch.rc.p': 'Governance, validator selection, and cross-chain coordination. Staking is moved off the Relay Chain so the democratic core stays lean and fast.',
'landing.arch.ah.tag': 'Pezkuwi AH · Asset Hub',
'landing.arch.ah.h4': 'HezDex on Asset Hub',
'landing.arch.ah.p': 'HEZ & PEZ issuance, liquidity pools, on-chain swaps, wrapped assets, staking. All asset operations and the validator economy live here.',
'landing.arch.people.tag': 'Pezkuwi People · People Chain',
'landing.arch.people.h4': 'Tîkî Identity',
'landing.arch.people.p': 'Citizenship NFTs, KYC, trust scores, social graph. Your on-chain identity — the prerequisite for voting and treasury access — lives here.',
'landing.arch.stats.block': 'Block',
'landing.arch.stats.time': 'Time',
'landing.arch.stats.validators': 'Validators',
'landing.arch.stats.staked': 'Staked',
'landing.arch.stats.collators': 'Collators',
'landing.arch.stats.nominators': 'Nominators',
'landing.arch.stats.citizens': 'Citizens',
'landing.arch.stats.countries': 'Countries',
// Section 04 Tokenomics
'landing.tok.eyebrow': '// 04 · Tokenomics',
'landing.tok.h2': 'Two tokens.',
'landing.tok.h2em': 'Two roles.',
'landing.tok.p': 'HEZ is the network stable utility unit — fixed supply, used for fees, staking collateral, and governance weight. PEZ is the citizen reward token — distributed through a synthetic-halving emission program.',
'landing.tok.tabHez': 'HEZ · Utility',
'landing.tok.tabPez': 'PEZ · Citizen',
'landing.tok.total': 'total',
// Referral
'landing.ref.eyebrow': '// Be a Reference',
'landing.ref.h2': "You don't just invite —",
'landing.ref.h2em': 'you refer.',
'landing.ref.p': 'Every friend you approve becomes a citizen of PezkuwiChain and earns you +10 Trust Score.',
'landing.ref.step1.label': 'Step 1',
'landing.ref.step1.title': 'Share Your Link',
'landing.ref.step1.desc': 'Send your personal referral link from the Pezkuwi wallet to someone you trust.',
'landing.ref.step2.label': 'Step 2',
'landing.ref.step2.title': 'They Apply',
'landing.ref.step2.desc': 'Your friend submits a Citizenship Application on PezkuwiChain and waits for your approval.',
'landing.ref.step3.label': 'Step 3',
'landing.ref.step3.title': 'You Approve — Then They Sign',
'landing.ref.step3.desc': 'Be their reference, then they sign the citizenship transaction. Your Trust Score grows by +10 on-chain.',
// CTA band
'landing.cta.eyebrow': '// Join the network',
'landing.cta.h2': 'Citizenship is',
'landing.cta.h2em': 'one signature away.',
'landing.cta.p': 'Connect your wallet, mint your soulbound citizenship NFT, and start voting on proposals that shape the digital state.',
'landing.cta.become': 'Become a citizen →',
'landing.cta.validator': 'Run a validator',
'landing.cta.services': 'Available Services',
// Pallets
'landing.pallets.eyebrow': '// 02b · Wallet ecosystem',
'landing.pallets.h2': 'Every primitive,',
'landing.pallets.h2em': 'one wallet.',
'landing.pallets.p': 'Sixteen pallets organized into four pillars — Finance, Governance, Social, and Education.',
'landing.pallets.finance': 'Finance',
'landing.pallets.financeCount': '8 modules',
'landing.pallets.governance': 'Governance',
'landing.pallets.governanceCount': '8 modules',
'landing.pallets.social': 'Social',
'landing.pallets.socialCount': '5 live · 3 soon',
'landing.pallets.education': 'Education',
'landing.pallets.educationCount': '4 live · 4 soon',
'landing.pallets.comingSoon': 'Coming soon',
'landing.pallets.wallet': 'Wallet',
'landing.pallets.bank': 'Bank',
'landing.pallets.exchange': 'Exchange',
'landing.pallets.dex': 'Pez-DEX',
'landing.pallets.p2p': 'P2P',
'landing.pallets.b2b': 'B2B',
'landing.pallets.zekat': 'Bac/Zekat',
'landing.pallets.launchpad': 'Launchpad',
'landing.pallets.president': 'President',
'landing.pallets.assembly': 'Assembly',
'landing.pallets.vote': 'Vote',
'landing.pallets.validators': 'Validators',
'landing.pallets.justice': 'Justice',
'landing.pallets.proposals': 'Proposals',
'landing.pallets.polls': 'Polls',
'landing.pallets.identity': 'Identity',
'landing.pallets.whatskurd': 'whatsKURD',
'landing.pallets.forum': 'Forum',
'landing.pallets.kurdmedia': 'KurdMedia',
'landing.pallets.events': 'Events',
'landing.pallets.help': 'Help',
'landing.pallets.music': 'Music',
'landing.pallets.rewshenbir': 'Rewshenbir',
'landing.pallets.referral': 'Referral',
'landing.pallets.university': 'University',
'landing.pallets.perwerde': 'Perwerde',
'landing.pallets.certificates': 'Certificates',
'landing.pallets.research': 'Research',
'landing.pallets.library': 'Library',
'landing.pallets.tutor': 'Tutor',
'landing.pallets.labs': 'Labs',
'landing.pallets.languages': 'Languages',
// Footer
'landing.footer.desc': 'A public, permissionless Layer 1 for the digital sovereignty of stateless and cultural nations — Kurds first, every people next. Open-source. Citizen-owned.',
'landing.footer.mainnet': 'Mainnet · 6s block time',
'landing.footer.network': 'Network',
'landing.footer.use': 'Use',
'landing.footer.build': 'Build',
'landing.footer.community': 'Community',
'landing.footer.explorer': 'Explorer',
'landing.footer.telemetry': 'Telemetry',
'landing.footer.validators': 'Validators',
'landing.footer.faucet': 'Faucet',
'landing.footer.wallet': 'Wallet',
'landing.footer.trade': 'Trade',
'landing.footer.vote': 'Vote',
'landing.footer.grants': 'Grants',
'landing.footer.docs': 'Documentation',
'landing.footer.api': 'API reference',
'landing.footer.sdk': 'SDK',
'landing.footer.github': 'GitHub',
'landing.footer.forum': 'Forum',
'landing.footer.discord': 'Discord',
'landing.footer.telegram': 'Telegram',
'landing.footer.twitter': 'X / Twitter',
'landing.footer.copyright': '© 2026 PezkuwiChain · Open-source under MIT',
'landing.footer.builtBy': 'Built by Dijital Pezkuwi Peoples & for every stateless and cultural nation',
}
-1
View File
@@ -3942,7 +3942,6 @@ export default {
'taxZekat.success': '{{amount}} HEZ با موفقیت ارسال شد. ممنون!',
// Messaging
'messaging.palletNotReady': 'پالت پیام‌رسانی هنوز در People Chain موجود نیست. یک به‌روزرسانی runtime لازم است.',
// KurdMedia page
'kurdMedia.title': 'KurdMedia',
+214 -2
View File
@@ -3821,6 +3821,7 @@ export default {
'mobile.app.help': 'Alîkarî',
'mobile.app.music': 'Muzîk',
'mobile.app.vpn': 'VPN',
'mobile.app.rewshenbir': 'Rewşenbir',
'mobile.app.referral': 'Referans',
'mobile.app.university': 'Zanînge',
'mobile.app.perwerde': 'Perwerde',
@@ -3925,7 +3926,6 @@ export default {
'taxZekat.success': '{{amount}} HEZ bi serfirazî hate şandin. Spas!',
// Messaging
'messaging.palletNotReady': 'Pergala peyamgehê hîn li ser People Chain tune ye. Nûvekirina runtime lazim e.',
// KurdMedia page
'kurdMedia.title': 'KurdMedia',
@@ -3956,4 +3956,216 @@ export default {
'help.feature.community': 'Têkiliya civakê',
'help.whatskurd.title': 'WhatsKURD Peyamgeh',
'help.whatskurd.desc': 'Bi pergala peyamgehê ya blockchain re bi me re têkildar bibe',
};
// ─── Landing Page (Kurdî Kurmancî) ──────────────────────────────────────────
// Nav
'landing.nav.network': 'Tora',
'landing.nav.governance': 'Rêveberî',
'landing.nav.trading': 'Bazirganî',
'landing.nav.citizens': 'Hemwelatî',
'landing.nav.docs': 'Belgename',
'landing.nav.mainnet': 'Mainnet',
'landing.nav.connectWallet': 'Cûzdan Girêde',
'landing.nav.login': 'Têkevin',
'landing.nav.peers': 'hevtal',
// Hero
'landing.hero.badge': 'Dewleta Kurdistana Dîjîtal · Nû li Mainnet',
'landing.hero.badgeVersion': 'v1.0',
'landing.hero.h1part1': 'Zincîreke serwer',
'landing.hero.h1part2': 'ji bo neteweyeke',
'landing.hero.h1accent': 'bê sînor',
'landing.hero.h1part3': '.',
'landing.hero.sub': 'PezkuwiChain blok zincîreke vekirî û bê destûr e — pêşî ji bo netewa Kurd, û ji bo her gelê bê dewlet û neteweyeke çandî li seranserê cîhanê hatiye çêkirin. Pêşniyarên demokratîk, hazîneya şefaf û nasnameya li ser zincîrê ji bo hemwelatîyan, li ku bijîn jî.',
'landing.hero.cta.explore': 'Torê bikole →',
'landing.hero.cta.whitepaper': 'Kaxeza Spî bixwîne',
'landing.hero.sun.name': 'Roj · Roja Kurdistanê',
'landing.hero.sun.rays': '21 tîr · ↻ ji 1932ê ve',
// Hero stat bar
'landing.statbar.network': 'Tor',
'landing.statbar.connected': 'Girêdayî',
'landing.statbar.latestBlock': 'Bloka Dawî',
'landing.statbar.finalized': 'Qedandî',
'landing.statbar.finalizedMeta': '~2 blok paş de',
'landing.statbar.validators': 'Erêker',
'landing.statbar.validatorsMeta': 'Blok erêdike',
'landing.statbar.collators': 'Kolator',
'landing.statbar.collatorsMeta': 'Blok çêdike',
'landing.statbar.nominators': 'Nominatör',
'landing.statbar.nominatorsMeta': 'Stake ji erêkeran re',
// Ticker
'landing.ticker.block': 'blok',
'landing.ticker.validators': 'erêker',
'landing.ticker.nominators': 'nominatör',
'landing.ticker.citizens': 'hemwelatî',
'landing.ticker.staked': 'stake',
'landing.ticker.proposals': 'pêşniyar',
'landing.ticker.peers': 'hevtal',
// Section 01 Tora Zindî
'landing.network.eyebrow': '// 01 · Tora Zindî',
'landing.network.h2': 'Jimareyên ku',
'landing.network.h2em': 'xwe rêve dibin.',
'landing.network.p': 'Her metrîk a li jêr rasterast ji relay chainê tê girtin — erêker çi dibînin, hûn jî dibînin.',
'landing.network.activeProposals': 'Pêşniyarên çalak',
'landing.network.proposalsMeta': '↗ rêveberî zindî',
'landing.network.totalVoters': 'Dengdêrên giştî',
'landing.network.votersMeta': 'dengdana conviction',
'landing.network.tokensStaked': 'Token stakekirî',
'landing.network.stakedMeta': "ji tevahiya peydabûnê",
'landing.network.citizens': 'Hemwelatî li seranserê cîhanê',
'landing.network.citizensMeta': 'li 187 welatan',
// Section 02 Taybetmendî
'landing.features.eyebrow': '// 02 · Hûn çi dikarin bikin',
'landing.features.h2': 'Zincîrek, her',
'landing.features.h2em': 'amûra medenî.',
'landing.features.p': 'Qata 1ê serbixwe — destpêk ji Polkadot hatiye dabeşkirin, naha kodbergeheke bi tevahî serwer e ku crate, pakêtên npm û palêtên xwe yên ji bo rêveberî, nasnameya, hazîne û bazirganiyê heye.',
'landing.features.01.eyebrow': '01 · Rêveberî',
'landing.features.01.h3': 'Li ser rêzikên ku tor û netewe rêve dibin deng bidin.',
'landing.features.01.p': 'Referandûmên mîna OpenGov bi dengdana conviction, delegasyon û heyama biryarê ya 7 rojan. Her hemwelatî dikare pêşniyar bide; her pêşniyar heta hetayê li zincîrê dimîne.',
'landing.features.01.link': 'Panela rêveberiyê veke →',
'landing.features.02.eyebrow': '02 · Hemwelatîtî',
'landing.features.02.h3': 'Nasnameya te, bi îmzeya dewletê.',
'landing.features.02.p': 'NFTa soulbound li ser People Chain. Pûana baweriyê, taybetmendiyên pejirandî, giraniya dengê — carekê tê dayîn, heta hetayê mînas dibe.',
'landing.features.02.link': 'Hemwelatî bibe →',
'landing.features.03.eyebrow': '03 · Aborî',
'landing.features.03.h3': 'Bi HEZ bazirganî bike, deyn bide û netewe fînan bike.',
'landing.features.03.p': 'Havzên DEX li Asset Hub, P2Pya bi piştgiriya emanetê, û hazîne ku grant û binesaziyê fînan dike — hemî li ser zincîrê tê rêvebirin.',
'landing.features.03.link': 'Aboriyê veke →',
'landing.features.04.eyebrow': '04 · Erêker',
'landing.features.04.p': 'Nominated Proof-of-Stake her blok ewle dike. HEZ stake bike da erêkeriyek piştgirî bike, an nodeke xwe bixebitîne.',
'landing.features.04.h3suffix': 'node. 12 netewe. Ji destpêkê ve sifir qutbûn.',
'landing.features.04.link': 'Node bixebitîne →',
// Section 03 Mîmarî
'landing.arch.eyebrow': '// 03 · Mîmarî',
'landing.arch.h2': 'Sê zincîr,',
'landing.arch.h2em': 'yek netewe.',
'landing.arch.p': 'Sê zincîrên serbixwe, bi tevahî xwediyê torê. Her palêt, crate û pakêt ya PezkuwiChain e — rêveberî, nasname, hazîne û bazirganî, hemî ji bo neteweyek dîjîtal hatine sêwirandin.',
'landing.arch.rc.tag': 'Pezkuwi RC · Relay Chain',
'landing.arch.rc.h4': 'Pezkuwi Relay',
'landing.arch.rc.p': 'Rêveberî, hilbijartina erêkeran û hevahengiya zincîrên xaçerêzî. Stake ji Relay Chainê hatiye veqetandin da ku navenda demokratîk sivik û bilez bimîne.',
'landing.arch.ah.tag': 'Pezkuwi AH · Asset Hub',
'landing.arch.ah.h4': 'HezDex li Asset Hub',
'landing.arch.ah.p': 'Weşana HEZ û PEZ, havzên lîkîdîteyê, takasen li ser zincîrê, xezineyên girtî, stake. Hemî operasyonên xezineyê û aboriya erêkeran li vir e.',
'landing.arch.people.tag': 'Pezkuwi People · People Chain',
'landing.arch.people.h4': 'Tîkî Identity',
'landing.arch.people.p': 'NFTên hemwelatîtiyê, KYC, pûanên baweriyê, grafiya civakî. Nasnameya te ya li ser zincîrê — şertê dengdanê û destpêkirina hazîneyê — li vir dijî.',
'landing.arch.stats.block': 'Blok',
'landing.arch.stats.time': 'Dem',
'landing.arch.stats.validators': 'Erêker',
'landing.arch.stats.staked': 'Stake',
'landing.arch.stats.collators': 'Kolator',
'landing.arch.stats.nominators': 'Nominatör',
'landing.arch.stats.citizens': 'Hemwelatî',
'landing.arch.stats.countries': 'Welat',
// Section 04 Tokenomîk
'landing.tok.eyebrow': '// 04 · Tokenomîk',
'landing.tok.h2': 'Du token.',
'landing.tok.h2em': 'Du rol.',
'landing.tok.p': 'HEZ yekîneya karûbarê torê ya bi peydabûna sabît e — ji bo komp, girevê stake û giraniya rêveberiyê tê bikar anîn. PEZ tokena xelata hemwelatîyê ye — bi bernameya weşana nîv-sentetîk tê dabeşkirin.',
'landing.tok.tabHez': 'HEZ · Karûbar',
'landing.tok.tabPez': 'PEZ · Hemwelatî',
'landing.tok.total': 'tevahî',
// Referral
'landing.ref.eyebrow': '// Referans Be',
'landing.ref.h2': 'Tu tenê vexwendin naşênî —',
'landing.ref.h2em': 'referans dibî.',
'landing.ref.p': 'Her hevalê ku tu erê dikî hemwelatiyê PezkuwiChain dibe û te +10 Pûana Baweriyê qezenc dike.',
'landing.ref.step1.label': 'Gava 1',
'landing.ref.step1.title': 'Girêdana xwe parve bike',
'landing.ref.step1.desc': 'Girêdana xweya şexsî ya referansê ji cûzdana Pezkuwi ji kesê ku pê bawer î re bişîne.',
'landing.ref.step2.label': 'Gava 2',
'landing.ref.step2.title': 'Ew serlêdidin',
'landing.ref.step2.desc': 'Hevalê te li ser PezkuwiChain Serlêdana Hemwelatîtiyê dike û li benda erêkirina te dimîne.',
'landing.ref.step3.label': 'Gava 3',
'landing.ref.step3.title': 'Tu erê dikî — Paşê ew îmze dikin',
'landing.ref.step3.desc': 'Referansa wan be, dûv re ew danûstandina hemwelatîtiyê îmze dikin. Pûana te ya Baweriyê li zincîrê +10 mezin dibe.',
// CTA
'landing.cta.eyebrow': '// Beşdarî torê bibe',
'landing.cta.h2': 'Hemwelatîtî',
'landing.cta.h2em': 'yek îmzeyê dûr e.',
'landing.cta.p': 'Cûzdana xwe girêde, NFTa hemwelatîtiya soulbound mint bike, û li ser pêşniyarên ku dewleta dîjîtal şekl didin deng bide.',
'landing.cta.become': 'Hemwelatî bibe →',
'landing.cta.validator': 'Erêker bixebitîne',
'landing.cta.services': 'Karûbarên Berdest',
// Pallets
'landing.pallets.eyebrow': '// 02b · Ekosîstema cûzdanê',
'landing.pallets.h2': 'Her amûr,',
'landing.pallets.h2em': 'yek cûzdan.',
'landing.pallets.p': 'Şanzdeh palêt di çar sûtûnan de rêxistin bûne — Fînanc, Rêveberî, Civakî û Perwerde.',
'landing.pallets.finance': 'Fînanc',
'landing.pallets.financeCount': '8 modul',
'landing.pallets.governance': 'Rêveberî',
'landing.pallets.governanceCount': '8 modul',
'landing.pallets.social': 'Civakî',
'landing.pallets.socialCount': '5 çalak · 3 nêzîk',
'landing.pallets.education': 'Perwerde',
'landing.pallets.educationCount': '4 çalak · 4 nêzîk',
'landing.pallets.comingSoon': 'Nêzîk e',
'landing.pallets.wallet': 'Cûzdan',
'landing.pallets.bank': 'Bank',
'landing.pallets.exchange': 'Pêdanbide',
'landing.pallets.dex': 'Pez-DEX',
'landing.pallets.p2p': 'P2P',
'landing.pallets.b2b': 'B2B',
'landing.pallets.zekat': 'Bac/Zekat',
'landing.pallets.launchpad': 'Launchpad',
'landing.pallets.president': 'Serok',
'landing.pallets.assembly': 'Meclîs',
'landing.pallets.vote': 'Deng',
'landing.pallets.validators': 'Erêker',
'landing.pallets.justice': 'Dadwer',
'landing.pallets.proposals': 'Pêşniyar',
'landing.pallets.polls': 'Dengdanên giştî',
'landing.pallets.identity': 'Nasname',
'landing.pallets.whatskurd': 'whatsKURD',
'landing.pallets.forum': 'Forum',
'landing.pallets.kurdmedia': 'KurdMedia',
'landing.pallets.events': 'Bûyer',
'landing.pallets.help': 'Alîkarî',
'landing.pallets.music': 'Muzîk',
'landing.pallets.rewshenbir': 'Rewşenbîr',
'landing.pallets.referral': 'Referans',
'landing.pallets.university': 'Zanîngeh',
'landing.pallets.perwerde': 'Perwerde',
'landing.pallets.certificates': 'Sertîfîka',
'landing.pallets.research': 'Lêkolîn',
'landing.pallets.library': 'Pirtûkxane',
'landing.pallets.tutor': 'Mamosta',
'landing.pallets.labs': 'Laborator',
'landing.pallets.languages': 'Ziman',
// Footer
'landing.footer.desc': 'Qata 1ê vekirî û bê destûr ji bo serweriya dîjîtal a neteweyên bê dewlet û çandî — pêşî Kurd, paşê her gel. Çavkaniya vekirî. Xwediyê hemwelatîyan.',
'landing.footer.mainnet': 'Mainnet · 6s dema blokê',
'landing.footer.network': 'Tor',
'landing.footer.use': 'Bikar bîne',
'landing.footer.build': 'Ava bike',
'landing.footer.community': 'Civak',
'landing.footer.explorer': 'Keşfker',
'landing.footer.telemetry': 'Telemetrî',
'landing.footer.validators': 'Erêker',
'landing.footer.faucet': 'Faucet',
'landing.footer.wallet': 'Cûzdan',
'landing.footer.trade': 'Bazirganî',
'landing.footer.vote': 'Deng',
'landing.footer.grants': 'Grant',
'landing.footer.docs': 'Belgename',
'landing.footer.api': 'Referansa API',
'landing.footer.sdk': 'SDK',
'landing.footer.github': 'GitHub',
'landing.footer.forum': 'Forum',
'landing.footer.discord': 'Discord',
'landing.footer.telegram': 'Telegram',
'landing.footer.twitter': 'X / Twitter',
'landing.footer.copyright': '© 2026 PezkuwiChain · Çavkaniya vekirî di bin lîsansa MIT de',
'landing.footer.builtBy': 'Ji aliyê Gelên Dîjîtal ên Pezkuwi ve, ji bo her neteweyê bê dewlet û çandî hatiye çêkirin',
}
+214 -2
View File
@@ -3824,6 +3824,7 @@ export default {
'mobile.app.help': 'Yardım',
'mobile.app.music': 'Müzik',
'mobile.app.vpn': 'VPN',
'mobile.app.rewshenbir': 'Rewshenbir',
'mobile.app.referral': 'Referans',
'mobile.app.university': 'Üniversite',
'mobile.app.perwerde': 'Eğitim',
@@ -3928,7 +3929,6 @@ export default {
'taxZekat.success': '{{amount}} HEZ başarıyla gönderildi. Teşekkürler!',
// Messaging
'messaging.palletNotReady': 'Mesajlaşma paleti henüz People Chain üzerinde mevcut değil. Bir runtime güncellemesi gerekiyor.',
// KurdMedia page
'kurdMedia.title': 'KurdMedia',
@@ -3959,4 +3959,216 @@ export default {
'help.feature.community': 'Topluluk İletişimi',
'help.whatskurd.title': 'WhatsKURD Mesajlaşma',
'help.whatskurd.desc': 'Blockchain mesajlaşma sistemi aracılığıyla bizimle iletişime geçin',
};
// ─── Landing Page (Türkçe) ───────────────────────────────────────────────────
// Nav
'landing.nav.network': 'Ağ',
'landing.nav.governance': 'Yönetişim',
'landing.nav.trading': 'Ticaret',
'landing.nav.citizens': 'Vatandaşlar',
'landing.nav.docs': 'Belgeler',
'landing.nav.mainnet': 'Mainnet',
'landing.nav.connectWallet': 'Cüzdan Bağla',
'landing.nav.login': 'Giriş',
'landing.nav.peers': 'eş',
// Hero
'landing.hero.badge': 'Dijital Kürdistan Devleti · Mainnet Yayında',
'landing.hero.badgeVersion': 'v1.0',
'landing.hero.h1part1': 'Egemen bir zincir',
'landing.hero.h1part2': 'sınırsız bir',
'landing.hero.h1accent': 'ulus',
'landing.hero.h1part3': 'için.',
'landing.hero.sub': 'PezkuwiChain; başta Kürt ulusu olmak üzere dünyanın dört bir yanındaki her devletsiz halk ve kültürel ulus için inşa edilmiş, açık ve izinsiz bir blok zinciridir. Demokratik öneriler, şeffaf hazine ve nerede yaşarsa yaşasın her vatandaş için zincir üstü kimlik.',
'landing.hero.cta.explore': 'Ağı keşfet →',
'landing.hero.cta.whitepaper': 'Teknik inceleme',
'landing.hero.sun.name': 'Roj · Kürdistan\'ın güneşi',
'landing.hero.sun.rays': '21 ışın · ↻ 1932\'den beri',
// Hero stat bar
'landing.statbar.network': 'Ağ',
'landing.statbar.connected': 'Bağlı',
'landing.statbar.latestBlock': 'Son Blok',
'landing.statbar.finalized': 'Kesinleşti',
'landing.statbar.finalizedMeta': '~2 blok geride',
'landing.statbar.validators': 'Doğrulayıcılar',
'landing.statbar.validatorsMeta': 'Blok doğruluyor',
'landing.statbar.collators': 'Kollatörler',
'landing.statbar.collatorsMeta': 'Blok üretiyor',
'landing.statbar.nominators': 'Nominatörler',
'landing.statbar.nominatorsMeta': 'Doğrulayıcılara stake',
// Ticker
'landing.ticker.block': 'blok',
'landing.ticker.validators': 'doğrulayıcı',
'landing.ticker.nominators': 'nominatör',
'landing.ticker.citizens': 'vatandaş',
'landing.ticker.staked': 'stake',
'landing.ticker.proposals': 'öneri',
'landing.ticker.peers': 'eş',
// Section 01 Canlı
'landing.network.eyebrow': '// 01 · Canlı ağ',
'landing.network.h2': 'Kendini yöneten',
'landing.network.h2em': 'rakamlar.',
'landing.network.p': 'Aşağıdaki her ölçüm doğrudan relay chain\'den alınır — doğrulayıcıların gördüğünü siz de görürsünüz.',
'landing.network.activeProposals': 'Aktif öneriler',
'landing.network.proposalsMeta': '↗ yönetişim canlı',
'landing.network.totalVoters': 'Toplam seçmen',
'landing.network.votersMeta': 'conviction oylama',
'landing.network.tokensStaked': 'Stake edilen token',
'landing.network.stakedMeta': 'toplam arzdan',
'landing.network.citizens': 'Dünya geneli vatandaş',
'landing.network.citizensMeta': '187 ülkede',
// Section 02 Özellikler
'landing.features.eyebrow': '// 02 · Neler yapabilirsiniz',
'landing.features.h2': 'Tek zincir, her',
'landing.features.h2em': 'sivil araç.',
'landing.features.p': 'Bağımsız bir Katman 1 — başlangıçta Polkadot\'tan çatallandı, artık yönetişim, kimlik, hazine ve ticaret için kendi palet, crate ve npm paketlerine sahip tam egemen bir kod tabanı.',
'landing.features.01.eyebrow': '01 · Yönetişim',
'landing.features.01.h3': 'Ağı ve ulusu yöneten kurallar üzerinde oy kullanın.',
'landing.features.01.p': 'Conviction oylama, delegasyon ve 7 günlük karar süresiyle OpenGov tarzı referandumlar. Her vatandaş öneride bulunabilir; her öneri sonsuza dek zincirde.',
'landing.features.01.link': 'Yönetişim panosunu aç →',
'landing.features.02.eyebrow': '02 · Vatandaşlık',
'landing.features.02.h3': 'Devlet tarafından imzalanmış kimliğiniz.',
'landing.features.02.p': 'People Chain üzerinde soulbound NFT. Güven puanı, doğrulanmış özellikler, oy ağırlığı — bir kez verilir, sonsuza dek sahiplenilir.',
'landing.features.02.link': 'Vatandaş ol →',
'landing.features.03.eyebrow': '03 · Ekonomi',
'landing.features.03.h3': 'HEZ ile ticaret yapın, borç verin ve ulusu fonlayın.',
'landing.features.03.p': 'Asset Hub\'da DEX havuzları, emanet destekli P2P ve altyapıyı fonlayan bir hazine — hepsi zincir üstünde yönetiliyor.',
'landing.features.03.link': 'Ekonomiyi aç →',
'landing.features.04.eyebrow': '04 · Doğrulayıcılar',
'landing.features.04.p': 'Nominated Proof-of-Stake her bloğu güvence altına alır. Bir doğrulayıcıyı desteklemek için HEZ stake edin veya kendi düğümünüzü çalıştırın.',
'landing.features.04.h3suffix': 'düğüm. 12 ulus. Genesis\'ten bu yana sıfır kesinti.',
'landing.features.04.link': 'Düğüm çalıştır →',
// Section 03 Mimari
'landing.arch.eyebrow': '// 03 · Mimari',
'landing.arch.h2': 'Üç zincir,',
'landing.arch.h2em': 'bir ulus.',
'landing.arch.p': 'Ağın tam sahibi olduğu üç bağımsız zincir. Her palet, crate ve paket PezkuwiChain\'e aittir — yönetişim, kimlik, hazine ve ticaret, hepsi dijital bir ulus için tasarlandı.',
'landing.arch.rc.tag': 'Pezkuwi RC · Relay Chain',
'landing.arch.rc.h4': 'Pezkuwi Relay',
'landing.arch.rc.p': 'Yönetişim, doğrulayıcı seçimi ve zincirlerarası koordinasyon. Stake, Relay Chain\'den ayrılmıştır; demokratik çekirdek hafif ve hızlı kalır.',
'landing.arch.ah.tag': 'Pezkuwi AH · Asset Hub',
'landing.arch.ah.h4': 'HezDex on Asset Hub',
'landing.arch.ah.p': 'HEZ ve PEZ ihracı, likidite havuzları, zincir üstü takaslar, sarılmış varlıklar, stake. Tüm varlık işlemleri ve doğrulayıcı ekonomisi burada.',
'landing.arch.people.tag': 'Pezkuwi People · People Chain',
'landing.arch.people.h4': 'Tîkî Identity',
'landing.arch.people.p': 'Vatandaşlık NFT\'leri, KYC, güven puanları, sosyal grafik. Zincir üstü kimliğiniz — oy kullanma ve hazine erişimi için ön koşul — burada yaşar.',
'landing.arch.stats.block': 'Blok',
'landing.arch.stats.time': 'Süre',
'landing.arch.stats.validators': 'Doğrulayıcı',
'landing.arch.stats.staked': 'Stake',
'landing.arch.stats.collators': 'Kollatör',
'landing.arch.stats.nominators': 'Nominatör',
'landing.arch.stats.citizens': 'Vatandaş',
'landing.arch.stats.countries': 'Ülke',
// Section 04 Tokenomik
'landing.tok.eyebrow': '// 04 · Tokenomik',
'landing.tok.h2': 'İki token.',
'landing.tok.h2em': 'İki rol.',
'landing.tok.p': 'HEZ, ağın sabit arzlı yardımcı birimi — ücretler, stake teminatı ve yönetişim ağırlığı için kullanılır. PEZ, sentetik-yarılanmalı emisyon programıyla dağıtılan vatandaş ödül tokenıdır.',
'landing.tok.tabHez': 'HEZ · Yardımcı',
'landing.tok.tabPez': 'PEZ · Vatandaş',
'landing.tok.total': 'toplam',
// Referral
'landing.ref.eyebrow': '// Referans Ol',
'landing.ref.h2': 'Sadece davet etmiyorsun —',
'landing.ref.h2em': 'referans oluyorsun.',
'landing.ref.p': 'Onayladığın her arkadaş PezkuwiChain vatandaşı olur ve sana +10 Güven Puanı kazandırır.',
'landing.ref.step1.label': 'Adım 1',
'landing.ref.step1.title': 'Bağlantını Paylaş',
'landing.ref.step1.desc': 'Pezkuwi cüzdanından kişisel referans bağlantını güvendiğin birine gönder.',
'landing.ref.step2.label': 'Adım 2',
'landing.ref.step2.title': 'Başvururlar',
'landing.ref.step2.desc': 'Arkadaşın PezkuwiChain\'e Vatandaşlık Başvurusu yapar ve onayını bekler.',
'landing.ref.step3.label': 'Adım 3',
'landing.ref.step3.title': 'Onaylarsın — Sonra İmzalarlar',
'landing.ref.step3.desc': 'Referansları ol, sonra vatandaşlık işlemini imzalarlar. Güven Puanın zincirde +10 artar.',
// CTA
'landing.cta.eyebrow': '// Ağa katıl',
'landing.cta.h2': 'Vatandaşlık',
'landing.cta.h2em': 'tek imzayla.',
'landing.cta.p': 'Cüzdanını bağla, soulbound vatandaşlık NFT\'ni mint et ve dijital devleti şekillendiren önerilerde oy kullanmaya başla.',
'landing.cta.become': 'Vatandaş ol →',
'landing.cta.validator': 'Doğrulayıcı çalıştır',
'landing.cta.services': 'Mevcut Hizmetler',
// Pallets
'landing.pallets.eyebrow': '// 02b · Cüzdan ekosistemi',
'landing.pallets.h2': 'Her araç,',
'landing.pallets.h2em': 'tek cüzdan.',
'landing.pallets.p': 'Dört sütunda düzenlenmiş on altı palet — Finans, Yönetişim, Sosyal ve Eğitim.',
'landing.pallets.finance': 'Finans',
'landing.pallets.financeCount': '8 modül',
'landing.pallets.governance': 'Yönetişim',
'landing.pallets.governanceCount': '8 modül',
'landing.pallets.social': 'Sosyal',
'landing.pallets.socialCount': '5 aktif · 3 yakında',
'landing.pallets.education': 'Eğitim',
'landing.pallets.educationCount': '4 aktif · 4 yakında',
'landing.pallets.comingSoon': 'Yakında',
'landing.pallets.wallet': 'Cüzdan',
'landing.pallets.bank': 'Banka',
'landing.pallets.exchange': 'Borsa',
'landing.pallets.dex': 'Pez-DEX',
'landing.pallets.p2p': 'P2P',
'landing.pallets.b2b': 'B2B',
'landing.pallets.zekat': 'Bac/Zekat',
'landing.pallets.launchpad': 'Launchpad',
'landing.pallets.president': 'Cumhurbaşkanı',
'landing.pallets.assembly': 'Meclis',
'landing.pallets.vote': 'Oy',
'landing.pallets.validators': 'Doğrulayıcılar',
'landing.pallets.justice': 'Adalet',
'landing.pallets.proposals': 'Öneriler',
'landing.pallets.polls': 'Anketler',
'landing.pallets.identity': 'Kimlik',
'landing.pallets.whatskurd': 'whatsKURD',
'landing.pallets.forum': 'Forum',
'landing.pallets.kurdmedia': 'KurdMedia',
'landing.pallets.events': 'Etkinlikler',
'landing.pallets.help': 'Yardım',
'landing.pallets.music': 'Müzik',
'landing.pallets.rewshenbir': 'Rewşenbîr',
'landing.pallets.referral': 'Referans',
'landing.pallets.university': 'Üniversite',
'landing.pallets.perwerde': 'Perwerde',
'landing.pallets.certificates': 'Sertifikalar',
'landing.pallets.research': 'Araştırma',
'landing.pallets.library': 'Kütüphane',
'landing.pallets.tutor': 'Öğretmen',
'landing.pallets.labs': 'Laboratuvar',
'landing.pallets.languages': 'Diller',
// Footer
'landing.footer.desc': 'Devletsiz ve kültürel ulusların dijital egemenliği için açık, izinsiz bir Katman 1 — önce Kürtler, ardından her halk. Açık kaynak. Vatandaşa ait.',
'landing.footer.mainnet': 'Mainnet · 6s blok süresi',
'landing.footer.network': 'Ağ',
'landing.footer.use': 'Kullan',
'landing.footer.build': 'İnşa Et',
'landing.footer.community': 'Topluluk',
'landing.footer.explorer': 'Gezgin',
'landing.footer.telemetry': 'Telemetri',
'landing.footer.validators': 'Doğrulayıcılar',
'landing.footer.faucet': 'Faucet',
'landing.footer.wallet': 'Cüzdan',
'landing.footer.trade': 'Ticaret',
'landing.footer.vote': 'Oy',
'landing.footer.grants': 'Hibeler',
'landing.footer.docs': 'Belgeler',
'landing.footer.api': 'API referansı',
'landing.footer.sdk': 'SDK',
'landing.footer.github': 'GitHub',
'landing.footer.forum': 'Forum',
'landing.footer.discord': 'Discord',
'landing.footer.telegram': 'Telegram',
'landing.footer.twitter': 'X / Twitter',
'landing.footer.copyright': '© 2026 PezkuwiChain · MIT lisansı altında açık kaynak',
'landing.footer.builtBy': 'Dijital Pezkuwi Halkları tarafından, her devletsiz ve kültürel ulus için inşa edildi',
}
+11
View File
@@ -0,0 +1,11 @@
// Production Rollup alias for vite-plugin-node-polyfills/shims/process.
// IMPORTANT: must not reference the `process` identifier at runtime —
// vite-plugin-node-polyfills rewrites it to `__process_polyfill`, creating
// a circular TDZ. Use bracket notation so the plugin leaves this file alone.
const g: Record<string, unknown> =
typeof globalThis !== 'undefined' ? (globalThis as Record<string, unknown>)
: typeof window !== 'undefined' ? (window as unknown as Record<string, unknown>)
: {};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export default (g['process'] ?? { env: {} }) as any;
+111 -6
View File
@@ -133,13 +133,9 @@ const Login: React.FC = () => {
try {
const { error } = await supabase.auth.signInWithOAuth({
provider: 'google',
options: {
redirectTo: window.location.origin + '/',
},
options: { redirectTo: window.location.origin + '/' },
});
if (error) {
setError(error.message);
}
if (error) setError(error.message);
} catch {
setError('Google sign-in failed. Please try again.');
} finally {
@@ -147,6 +143,91 @@ const Login: React.FC = () => {
}
};
const handleXSignIn = async () => {
setError('');
setLoading(true);
try {
const { error } = await supabase.auth.signInWithOAuth({
provider: 'twitter',
options: { redirectTo: window.location.origin + '/' },
});
if (error) setError(error.message);
} catch {
setError('X sign-in failed. Please try again.');
} finally {
setLoading(false);
}
};
const handleTelegramSignIn = () => {
setError('');
setLoading(true);
const BOT_ID = '8690398980';
const origin = window.location.origin;
const popup = window.open(
`https://oauth.telegram.org/auth?bot_id=${BOT_ID}&origin=${encodeURIComponent(origin)}&embed=1&request_access=write`,
'TelegramLogin',
'width=550,height=470,left=400,top=200'
);
if (!popup) {
setError('Popup blocked. Please allow popups for this site.');
setLoading(false);
return;
}
const onMessage = async (event: MessageEvent) => {
if (event.origin !== 'https://oauth.telegram.org') return;
if (!event.data || event.data.event !== 'auth_result') return;
window.removeEventListener('message', onMessage);
popup.close();
try {
const tgData = event.data.result;
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY;
const res = await fetch(`${supabaseUrl}/functions/v1/telegram-auth`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'apikey': supabaseKey,
'Authorization': `Bearer ${supabaseKey}`,
},
body: JSON.stringify(tgData),
});
const json = await res.json();
if (!res.ok) throw new Error(json.error || 'Telegram auth failed');
const { error: otpError } = await supabase.auth.verifyOtp({
token_hash: json.token_hash,
type: 'magiclink',
});
if (otpError) throw otpError;
navigate('/');
} catch (err) {
setError(err instanceof Error ? err.message : 'Telegram sign-in failed.');
} finally {
setLoading(false);
}
};
window.addEventListener('message', onMessage);
// Cleanup if popup is closed without completing auth
const pollClosed = setInterval(() => {
if (popup.closed) {
clearInterval(pollClosed);
window.removeEventListener('message', onMessage);
setLoading(false);
}
}, 500);
};
return (
<div className="min-h-screen bg-gradient-to-br from-gray-900 via-black to-gray-900 flex items-center justify-center p-4">
<div className="absolute inset-0 bg-[url('/grid.svg')] bg-center [mask-image:linear-gradient(180deg,white,rgba(255,255,255,0))]"></div>
@@ -404,6 +485,30 @@ const Login: React.FC = () => {
</Button>
)}
<Button
variant="outline"
className="w-full border-gray-700 bg-gray-800 hover:bg-gray-700 text-white"
onClick={handleXSignIn}
disabled={loading}
>
<svg className="mr-2 h-4 w-4" viewBox="0 0 24 24" fill="currentColor">
<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" />
</svg>
{t('login.xSignIn', 'Continue with X')}
</Button>
<Button
variant="outline"
className="w-full border-gray-700 bg-gray-800 hover:bg-gray-700 text-white"
onClick={handleTelegramSignIn}
disabled={loading}
>
<svg className="mr-2 h-4 w-4" viewBox="0 0 24 24" fill="#26A5E4">
<path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm5.562 8.248-1.97 9.28c-.145.658-.537.818-1.084.508l-3-2.21-1.447 1.394c-.16.16-.295.295-.605.295l.213-3.053 5.56-5.023c.242-.213-.054-.333-.373-.12L6.12 14.26l-2.96-.924c-.643-.204-.657-.643.136-.953l11.57-4.461c.537-.194 1.006.131.696.326z"/>
</svg>
{t('login.telegramSignIn', 'Continue with Telegram')}
</Button>
<Button
variant="outline"
className="w-full border-gray-700 bg-gray-800 hover:bg-gray-700 text-white"