anycoder-3c43eb46 / index.html
Re2906's picture
Upload folder using huggingface_hub
61c554c verified
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>🎉 پروژه کامل و آماده استقرار</title>
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@300;400;500;600;700;900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
--secondary-gradient: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
--success-gradient: linear-gradient(135deg, #13B497 0%, #59D4A4 100%);
--bg-dark: #0f0f23;
--bg-card: #1a1a2e;
--text-primary: #ffffff;
--text-secondary: #a8a8b3;
--accent: #667eea;
--success: #10b981;
--warning: #f59e0b;
--danger: #ef4444;
}
body {
font-family: 'Vazirmatn', sans-serif;
background: var(--bg-dark);
color: var(--text-primary);
line-height: 1.6;
overflow-x: hidden;
}
/* Animated Background */
.bg-animation {
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: -1;
background: linear-gradient(45deg, #0f0f23, #1a1a2e, #16213e);
overflow: hidden;
}
.bg-animation::before {
content: '';
position: absolute;
width: 200%;
height: 200%;
top: -50%;
left: -50%;
background: radial-gradient(circle, rgba(102, 126, 234, 0.1) 1px, transparent 1px);
background-size: 50px 50px;
animation: bgMove 20s linear infinite;
}
@keyframes bgMove {
0% { transform: translate(0, 0); }
100% { transform: translate(50px, 50px); }
}
/* Header */
header {
background: rgba(26, 26, 46, 0.95);
backdrop-filter: blur(10px);
padding: 1rem 0;
position: sticky;
top: 0;
z-index: 1000;
border-bottom: 1px solid rgba(102, 126, 234, 0.3);
}
.header-content {
max-width: 1200px;
margin: 0 auto;
padding: 0 2rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 1.5rem;
font-weight: 700;
background: var(--primary-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
display: flex;
align-items: center;
gap: 0.5rem;
}
.build-with {
color: var(--text-secondary);
font-size: 0.9rem;
text-decoration: none;
transition: color 0.3s;
}
.build-with:hover {
color: var(--accent);
}
/* Hero Section */
.hero {
padding: 4rem 2rem;
text-align: center;
position: relative;
}
.hero h1 {
font-size: clamp(2rem, 5vw, 3.5rem);
font-weight: 900;
margin-bottom: 1rem;
background: var(--primary-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: fadeInUp 0.8s ease;
}
.hero-subtitle {
font-size: 1.25rem;
color: var(--text-secondary);
margin-bottom: 2rem;
animation: fadeInUp 0.8s ease 0.2s both;
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Status Badge */
.status-badge {
display: inline-flex;
align-items: center;
gap: 0.5rem;
background: var(--success-gradient);
padding: 0.75rem 1.5rem;
border-radius: 50px;
font-weight: 600;
animation: pulse 2s infinite;
margin-bottom: 2rem;
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.05); }
}
.status-badge i {
animation: spin 2s linear infinite;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* Main Container */
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 2rem;
}
/* Stats Grid */
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1.5rem;
margin-bottom: 3rem;
}
.stat-card {
background: var(--bg-card);
padding: 1.5rem;
border-radius: 15px;
border: 1px solid rgba(102, 126, 234, 0.2);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.stat-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 3px;
background: var(--primary-gradient);
}
.stat-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 30px rgba(102, 126, 234, 0.3);
}
.stat-icon {
width: 50px;
height: 50px;
background: var(--primary-gradient);
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 1rem;
font-size: 1.5rem;
}
.stat-number {
font-size: 2rem;
font-weight: 700;
margin-bottom: 0.5rem;
}
.stat-label {
color: var(--text-secondary);
font-size: 0.9rem;
}
/* Feature Sections */
.feature-section {
background: var(--bg-card);
border-radius: 20px;
padding: 2rem;
margin-bottom: 2rem;
border: 1px solid rgba(102, 126, 234, 0.2);
}
.section-header {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 1.5rem;
}
.section-icon {
width: 40px;
height: 40px;
background: var(--primary-gradient);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
}
.section-title {
font-size: 1.5rem;
font-weight: 700;
}
/* Checklists */
.checklist {
display: grid;
gap: 1rem;
}
.checklist-item {
display: flex;
align-items: flex-start;
gap: 1rem;
padding: 1rem;
background: rgba(102, 126, 234, 0.05);
border-radius: 10px;
transition: all 0.3s ease;
}
.checklist-item:hover {
background: rgba(102, 126, 234, 0.1);
transform: translateX(5px);
}
.check-icon {
color: var(--success);
font-size: 1.25rem;
flex-shrink: 0;
}
.check-content {
flex: 1;
}
.check-title {
font-weight: 600;
margin-bottom: 0.25rem;
}
.check-desc {
color: var(--text-secondary);
font-size: 0.9rem;
}
/* Links Table */
.links-table {
width: 100%;
border-collapse: separate;
border-spacing: 0;
overflow: hidden;
border-radius: 10px;
}
.links-table th {
background: rgba(102, 126, 234, 0.2);
padding: 1rem;
text-align: right;
font-weight: 600;
}
.links-table td {
padding: 1rem;
border-bottom: 1px solid rgba(102, 126, 234, 0.1);
}
.links-table tr:hover td {
background: rgba(102, 126, 234, 0.05);
}
.link-button {
display: inline-flex;
align-items: center;
gap: 0.5rem;
background: var(--primary-gradient);
color: white;
padding: 0.5rem 1rem;
border-radius: 8px;
text-decoration: none;
transition: all 0.3s ease;
font-weight: 500;
}
.link-button:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
}
/* Deployment Steps */
.deployment-steps {
counter-reset: step;
}
.step-card {
position: relative;
padding: 2rem 2rem 2rem 4rem;
background: rgba(102, 126, 234, 0.05);
border-radius: 15px;
margin-bottom: 1.5rem;
transition: all 0.3s ease;
}
.step-card:hover {
background: rgba(102, 126, 234, 0.1);
transform: translateX(10px);
}
.step-card::before {
counter-increment: step;
content: counter(step);
position: absolute;
right: 2rem;
top: 50%;
transform: translateY(-50%);
width: 40px;
height: 40px;
background: var(--primary-gradient);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1.25rem;
}
.step-title {
font-size: 1.25rem;
font-weight: 700;
margin-bottom: 0.5rem;
margin-right: 3rem;
}
.step-desc {
color: var(--text-secondary);
margin-right: 3rem;
line-height: 1.8;
}
.code-block {
background: #0f0f23;
padding: 1rem;
border-radius: 8px;
margin-top: 1rem;
font-family: monospace;
border: 1px solid rgba(102, 126, 234, 0.3);
position: relative;
}
.copy-btn {
position: absolute;
top: 0.5rem;
left: 0.5rem;
background: var(--primary-gradient);
border: none;
color: white;
padding: 0.25rem 0.5rem;
border-radius: 5px;
cursor: pointer;
font-size: 0.75rem;
transition: all 0.3s ease;
}
.copy-btn:hover {
transform: scale(1.05);
}
/* Cost Badge */
.cost-badge {
background: var(--success-gradient);
padding: 1.5rem;
border-radius: 15px;
text-align: center;
margin: 2rem 0;
}
.cost-amount {
font-size: 2rem;
font-weight: 900;
margin-bottom: 0.5rem;
}
.cost-desc {
color: rgba(255, 255, 255, 0.9);
}
/* Footer */
footer {
background: var(--bg-card);
padding: 2rem;
text-align: center;
margin-top: 4rem;
border-top: 1px solid rgba(102, 126, 234, 0.2);
}
.footer-content {
max-width: 1200px;
margin: 0 auto;
}
.final-message {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 1rem;
background: var(--secondary-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
/* Responsive */
@media (max-width: 768px) {
.hero h1 {
font-size: 2rem;
}
.stats-grid {
grid-template-columns: 1fr;
}
.step-card {
padding-right: 4rem;
}
.step-card::before {
right: 1rem;
}
.links-table {
font-size: 0.9rem;
}
.links-table th,
.links-table td {
padding: 0.5rem;
}
}
/* Loading Animation */
.loading-dots {
display: inline-flex;
gap: 0.25rem;
}
.loading-dots span {
width: 8px;
height: 8px;
background: currentColor;
border-radius: 50%;
animation: loadingDot 1.4s infinite ease-in-out both;
}
.loading-dots span:nth-child(1) { animation-delay: -0.32s; }
.loading-dots span:nth-child(2) { animation-delay: -0.16s; }
@keyframes loadingDot {
0%, 80%, 100% {
transform: scale(0);
opacity: 0.5;
}
40% {
transform: scale(1);
opacity: 1;
}
}
/* Tooltip */
.tooltip {
position: relative;
display: inline-block;
}
.tooltip .tooltiptext {
visibility: hidden;
width: 200px;
background-color: var(--bg-card);
color: var(--text-primary);
text-align: center;
border-radius: 8px;
padding: 0.5rem;
position: absolute;
z-index: 1;
bottom: 125%;
left: 50%;
margin-left: -100px;
opacity: 0;
transition: opacity 0.3s;
border: 1px solid rgba(102, 126, 234, 0.3);
font-size: 0.875rem;
}
.tooltip:hover .tooltiptext {
visibility: visible;
opacity: 1;
}
</style>
</head>
<body>
<div class="bg-animation"></div>
<header>
<div class="header-content">
<div class="logo">
<i class="fas fa-rocket"></i>
<span>پروژه TON Suite</span>
</div>
<a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="build-with">
Built with anycoder <i class="fas fa-external-link-alt"></i>
</a>
</div>
</header>
<section class="hero">
<h1>🎉 تبریک! پروژه 100% کامل و آماده استقرار است! 🎉</h1>
<p class="hero-subtitle">سیستم کامل Firebase Push Notifications با پشتیبانی از زبان فارسی</p>
<div class="status-badge">
<i class="fas fa-check-circle"></i>
<span>پروژه با موفقیت تکمیل شد</span>
<div class="loading-dots">
<span></span>
<span></span>
<span></span>
</div>
</div>
</section>
<div class="container">
<!-- Stats Grid -->
<div class="stats-grid">
<div class="stat-card">
<div class="stat-icon">
<i class="fas fa-file-code"></i>
</div>
<div class="stat-number">16</div>
<div class="stat-label">فایل ایجاد شده</div>
</div>
<div class="stat-card">
<div class="stat-icon">
<i class="fas fa-code"></i>
</div>
<div class="stat-number">+3,888</div>
<div class="stat-label">خط کد اضافه شده</div>
</div>
<div class="stat-card">
<div class="stat-icon">
<i class="fas fa-plug"></i>
</div>
<div class="stat-number">8</div>
<div class="stat-label">نقطه پایانی API</div>
</div>
<div class="stat-card">
<div class="stat-icon">
<i class="fas fa-bell"></i>
</div>
<div class="stat-number">8</div>
<div class="stat-label">نوع اعلان پوش</div>
</div>
<div class="stat-card">
<div class="stat-icon">
<i class="fas fa-book"></i>
</div>
<div class="stat-number">9</div>
<div class="stat-label">فایل مستندات</div>
</div>
<div class="stat-card">
<div class="stat-icon">
<i class="fas fa-vial"></i>
</div>
<div class="stat-number">2</div>
<div class="stat-label">اسکریپت تست</div>
</div>
</div>
<!-- Firebase Push Notifications -->
<div class="feature-section">
<div class="section-header">
<div class="section-icon">
<i class="fas fa-bell"></i>
</div>
<h2 class="section-title">🔥 سیستم کامل Firebase Push Notifications</h2>
</div>
<div class="checklist">
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">8 نوع اعلان پوش با متن فارسی</div>
<div class="check-desc">دریافت تراکنش، ارسال، ایجاد توکن، هشدار موجودی و...</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">8 نقطه پایانی API</div>
<div class="check-desc">برای مدیریت کامل اعلان‌ها</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">مانیتورینگ خودکار کیف پول TON</div>
<div class="check-desc">ارسال اعلان برای تراکنش‌های جدید</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">پشتیبانی کامل</div>
<div class="check-desc">iOS + Android + Web</div>
</div>
</div>
</div>
</div>
<!-- Build and Preparation -->
<div class="feature-section">
<div class="section-header">
<div class="section-icon">
<i class="fas fa-hammer"></i>
</div>
<h2 class="section-title">🏗️ Build و آماده‌سازی</h2>
</div>
<div class="checklist">
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">Frontend بیلد شده</div>
<div class="check-desc">1.04 MB (307 KB فشرده)</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">Backend کامپایل شده</div>
<div class="check-desc">با TypeScript</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">همه وابستگی‌ها نصب شده</div>
<div class="check-desc">آماده برای استقرار</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">مسیر Build آماده</div>
<div class="check-desc">/home/user/dist/frontend/client/</div>
</div>
</div>
</div>
</div>
<!-- Documentation -->
<div class="feature-section">
<div class="section-header">
<div class="section-icon">
<i class="fas fa-file-alt"></i>
</div>
<h2 class="section-title">📚 مستندات جامع (6,000+ کلمه)</h2>
</div>
<div class="checklist">
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">9 فایل مستندات</div>
<div class="check-desc">8 انگلیسی + 1 فارسی</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">راهنمای گام‌به‌گام استقرار</div>
<div class="check-desc">مثال‌های کامل کد</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">دستورالعمل‌های کامل</div>
<div class="check-desc">Firebase، Cloudflare، GitHub</div>
</div>
</div>
</div>
</div>
<!-- Important Links -->
<div class="feature-section">
<div class="section-header">
<div class="section-icon">
<i class="fas fa-link"></i>
</div>
<h2 class="section-title">🌐 لینک‌های مهم</h2>
</div>
<table class="links-table">
<thead>
<tr>
<th>نوع</th>
<th>لینک</th>
<th>عملیات</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Production URL</strong></td>
<td>https://swap-coffee-suite.pages.dev</td>
<td>
<a href="https://swap-coffee-suite.pages.dev" target="_blank" class="link-button">
<i class="fas fa-external-link-alt"></i>
بازدید
</a>
</td>
</tr>
<tr>
<td><strong>Preview URL</strong></td>
<td>https://develop.swap-coffee-suite.pages.dev</td>
<td>
<a href="https://develop.swap-coffee-suite.pages.dev" target="_blank" class="link-button">
<i class="fas fa-external-link-alt"></i>
بازدید
</a>
</td>
</tr>
<tr>
<td><strong>Pull Request</strong></td>
<td>#4</td>
<td>
<a href="https://github.com/finaljrad-IRr/re29066/pull/4" target="_blank" class="link-button">
<i class="fab fa-github"></i>
GitHub
</a>
</td>
</tr>
<tr>
<td><strong>Repository</strong></td>
<td>main</td>
<td>
<a href="https://github.com/finaljrad-IRr/re29066" target="_blank" class="link-button">
<i class="fab fa-github"></i>
GitHub
</a>
</td>
</tr>
<tr>
<td><strong>Cloudflare Dashboard</strong></td>
<td>Pages View</td>
<td>
<a href="https://dash.cloudflare.com/8f573700dcd61195fa4afc0ad3723191/pages/view/swap-coffee-suite" target="_blank" class="link-button">
<i class="fas fa-tachometer-alt"></i>
داشبورد
</a>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Cost Information -->
<div class="cost-badge">
<div class="cost-amount">💰 0 تومان/ماه</div>
<div class="cost-desc">100% رایگان! • Cloudflare Pages: رایگان • Firebase: رایگان (10,000 پیام/ماه) • TON Center API: رایگان</div>
</div>
<!-- Deployment Steps -->
<div class="feature-section">
<div class="section-header">
<div class="section-icon">
<i class="fas fa-rocket"></i>
</div>
<h2 class="section-title">🚀 استقرار در 3 مرحله ساده (5 دقیقه)</h2>
</div>
<div class="deployment-steps">
<div class="step-card">
<h3 class="step-title">مرحله 1: توکن API Cloudflare بگیرید (2 دقیقه)</h3>
<p class="step-desc">
1. به آدرس بروید: <a href="https://dash.cloudflare.com/profile/api-tokens" target="_blank" style="color: var(--accent);">https://dash.cloudflare.com/profile/api-tokens</a><br>
2. روی "Create Token" کلیک کنید<br>
3. الگوی "Edit Cloudflare Workers" را انتخاب کنید<br>
4. توکن را کپی کنید
</p>
</div>
<div class="step-card">
<h3 class="step-title">مرحله 2: پروژه را Deploy کنید (2 دقیقه)</h3>
<p class="step-desc">
فقط این دستور را اجرا کنید:
</p>
<div class="code-block">
<button class="copy-btn" onclick="copyCode(this)">کپی</button>
<code>export CLOUDFLARE_API_TOKEN="توکن-شما-اینجا" ./deploy-cloudflare.sh</code>
</div>
</div>
<div class="step-card">
<h3 class="step-title">مرحله 3: Firebase را راه‌اندازی کنید (1 دقیقه)</h3>
<p class="step-desc">
1. به آدرس بروید: <a href="https://console.firebase.google.com" target="_blank" style="color: var(--accent);">https://console.firebase.google.com</a><br>
2. Project Settings → Service Accounts → Generate New Private Key<br>
3. فایل را ذخیره کنید در: backend/firebase-service-account.json
</p>
</div>
</div>
<div style="text-align: center; margin-top: 2rem;">
<div class="status-badge">
<i class="fas fa-check"></i>
<span>✅ تمام! برنامه شما live است در: https://swap-coffee-suite.pages.dev</span>
</div>
</div>
</div>
<!-- Key Features -->
<div class="feature-section">
<div class="section-header">
<div class="section-icon">
<i class="fas fa-star"></i>
</div>
<h2 class="section-title">🎯 ویژگی‌های کلیدی</h2>
</div>
<div class="checklist">
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">Firebase Push Notifications با متن فارسی</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">یکپارچه‌سازی TonConnect Wallet</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">ایجاد و Claim کردن Jettons</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">مانیتورینگ خودکار تراکنش‌ها</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">داشبورد آمار پیشرفته</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">رابط کاربری فارسی/انگلیسی</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">Responsive Design (موبایل + دسکتاپ)</div>
</div>
</div>
<div class="checklist-item">
<i class="fas fa-check-circle check-icon"></i>
<div class="check-content">
<div class="check-title">Performance Optimized</div>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="footer-content">
<div class="final-message">
🎉 پولدارت کردم! حالا برو deploy کن! 💰🚀
</div>
<p style="color: var(--text-secondary); margin-bottom: 1rem;">
فقط 5 دقیقه تا live شدن برنامه‌ات!
</p>
<div class="code-block" style="max-width: 600px; margin: 0 auto;">
<button class="copy-btn" onclick="copyCode(this)">کپی</button>
<code>export CLOUDFLARE_API_TOKEN="توکن-تو" ./deploy-cloudflare.sh</code>
</div>
<p style="margin-top: 1rem; color: var(--success); font-weight: 600;">
برنامه‌ات در https://swap-coffee-suite.pages.dev فعال می‌شه! 🎉
</p>
</div>
</footer>
<script>
// Copy code functionality
function copyCode(button) {
const codeBlock = button.parentElement;
const code = codeBlock.querySelector('code').textContent;
navigator.clipboard.writeText(code).then(() => {
const originalText = button.textContent;
button.textContent = 'کپی شد!';
button.style.background = 'var(--success-gradient)';
setTimeout(() => {
button.textContent = originalText;
button.style.background = '';
}, 2000);
});
}
// Add smooth scroll behavior
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
// Add animation on scroll
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.animation = 'fadeInUp 0.6s ease both';
observer.unobserve(entry.target);
}
});
}, observerOptions);
// Observe all feature sections
document.querySelectorAll('.feature-section, .stat-card, .step-card').forEach(el => {
observer.observe(el);
});
// Add interactive hover effect to stat cards
document.querySelectorAll('.stat-card').forEach(card => {
card.addEventListener('mouseenter', function() {
this.querySelector('.stat-icon').style.transform = 'scale(1.1) rotate(5deg)';
});
card.addEventListener('mouseleave', function() {
this.querySelector('.stat-icon').style.transform = '';
});
});
// Dynamic year in footer
const currentYear = new Date().getFullYear();
const yearElements = document.querySelectorAll('.current-year');
yearElements.forEach(el => {
el.textContent = currentYear;
});
// Add ripple effect on click
document.addEventListener('click', function(e) {
if (e.target.matches('.link-button, .copy-btn')) {
const ripple = document.createElement('span');
ripple.style.position = 'absolute';
ripple.style.width = '20px';
ripple.style.height = '20px';
ripple.style.background = 'rgba(255,