-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcheckout.html
More file actions
593 lines (540 loc) · 41.8 KB
/
checkout.html
File metadata and controls
593 lines (540 loc) · 41.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NODUS PRO — Product Hunt Launch Price</title>
<script src="https://cdn.paddle.com/paddle/v2/paddle.js"></script>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg: #0a0c12;
--panel: #131720;
--border: #2d3748;
--yellow: #facc15;
--text: #e2e8f0;
--sub: #94a3b8;
--muted: #475569;
--green: #10b981;
--purple: #667eea;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: var(--bg);
color: var(--text);
min-height: 100vh;
padding: 40px 20px 60px;
}
nav {
max-width: 900px;
margin: 0 auto 48px;
}
.nav-inner { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.nav-logo { font-size: 18px; font-weight: 900; color: var(--yellow); text-decoration: none; letter-spacing: -0.5px; }
.nav-back { font-size: 13px; color: var(--sub); text-decoration: none; }
.nav-back:hover { color: var(--text); }
.page-header { text-align: center; margin-bottom: 48px; }
.ph-badge {
display: inline-flex;
align-items: center;
gap: 8px;
background: rgba(250,100,0,0.15);
border: 1px solid rgba(250,100,0,0.35);
color: #fb923c;
font-size: 12px;
font-weight: 700;
padding: 5px 14px;
border-radius: 99px;
margin-bottom: 16px;
letter-spacing: 0.5px;
text-transform: uppercase;
}
.page-title { font-size: clamp(28px, 5vw, 44px); font-weight: 900; letter-spacing: -1px; margin-bottom: 12px; }
.page-title span { color: var(--yellow); }
.page-sub { font-size: 16px; color: var(--sub); }
.error-message {
background: rgba(239,68,68,0.12);
border: 1px solid rgba(239,68,68,0.3);
color: #f87171;
padding: 12px 16px;
border-radius: 10px;
margin: 0 auto 24px;
max-width: 900px;
text-align: center;
display: none;
font-size: 14px;
}
.lifetime-card {
max-width: 900px;
margin: 0 auto 24px;
background: linear-gradient(135deg, #1a1a0e 0%, #131720 60%);
border: 2px solid var(--yellow);
border-radius: 20px;
padding: 40px;
position: relative;
overflow: hidden;
cursor: pointer;
}
.lifetime-card::before {
content: '';
position: absolute;
top: -60px; right: -60px;
width: 200px; height: 200px;
background: radial-gradient(circle, rgba(250,204,21,0.12) 0%, transparent 70%);
pointer-events: none;
}
.lifetime-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; flex-wrap: wrap; }
.lifetime-left { flex: 1; min-width: 260px; }
.lifetime-badge {
display: inline-flex;
align-items: center;
gap: 6px;
background: var(--yellow);
color: #0a0c12;
font-size: 11px;
font-weight: 800;
padding: 4px 12px;
border-radius: 99px;
margin-bottom: 16px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.lifetime-name { font-size: 28px; font-weight: 900; color: var(--yellow); margin-bottom: 8px; letter-spacing: -0.5px; }
.lifetime-desc { font-size: 15px; color: var(--sub); line-height: 1.6; max-width: 420px; }
.lifetime-right { text-align: right; flex-shrink: 0; }
.lifetime-price-old { font-size: 14px; color: var(--muted); text-decoration: line-through; margin-bottom: 4px; }
.lifetime-price { font-size: 56px; font-weight: 900; color: var(--yellow); line-height: 1; letter-spacing: -2px; }
.lifetime-once { font-size: 14px; color: var(--sub); margin-top: 4px; }
.lifetime-slots {
display: inline-flex;
align-items: center;
gap: 6px;
margin-top: 12px;
background: rgba(239,68,68,0.12);
border: 1px solid rgba(239,68,68,0.3);
color: #f87171;
font-size: 13px;
font-weight: 700;
padding: 6px 14px;
border-radius: 8px;
}
.slot-dot { width: 7px; height: 7px; background: #ef4444; border-radius: 50%; animation: pulse 1.5s infinite; flex-shrink: 0; }
@keyframes pulse { 0%,100%{opacity:1} 50%{opacity:0.4} }
.lifetime-features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 10px;
margin: 28px 0;
padding-top: 28px;
border-top: 1px solid rgba(250,204,21,0.2);
}
.lf-item { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--text); }
.lf-item::before { content: "✓"; color: var(--yellow); font-weight: 800; flex-shrink: 0; }
.btn-lifetime {
width: 100%;
padding: 18px;
background: var(--yellow);
color: #0a0c12;
border: none;
border-radius: 12px;
font-size: 18px;
font-weight: 800;
cursor: pointer;
transition: all 0.2s;
letter-spacing: -0.3px;
}
.btn-lifetime:hover:not(:disabled) { background: #fde047; transform: translateY(-2px); box-shadow: 0 8px 24px rgba(250,204,21,0.3); }
.btn-lifetime:disabled { opacity: 0.6; cursor: wait; }
.btn-lifetime-sub { text-align: center; font-size: 12px; color: var(--muted); margin-top: 10px; }
.or-divider {
max-width: 900px;
margin: 8px auto 20px;
display: flex;
align-items: center;
gap: 16px;
color: var(--muted);
font-size: 13px;
}
.or-divider::before, .or-divider::after { content: ''; flex: 1; height: 1px; background: var(--border); }
.plans { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; max-width: 900px; margin: 0 auto 32px; }
@media (max-width: 640px) { .plans { grid-template-columns: 1fr; } }
.plan {
border: 1px solid var(--border);
border-radius: 16px;
padding: 28px 24px;
background: var(--panel);
position: relative;
transition: border-color 0.2s, transform 0.2s;
cursor: pointer;
}
.plan:hover { border-color: var(--purple); transform: translateY(-3px); }
.plan.recommended { border-color: var(--purple); }
.badge-rec {
position: absolute;
top: -11px; right: 16px;
background: var(--purple);
color: white;
font-size: 11px;
font-weight: 700;
padding: 4px 12px;
border-radius: 99px;
text-transform: uppercase;
}
.plan-name { font-size: 18px; font-weight: 700; color: var(--text); margin-bottom: 8px; }
.plan-price { font-size: 40px; font-weight: 900; color: var(--purple); margin-bottom: 4px; letter-spacing: -1px; }
.plan-period { font-size: 14px; color: var(--sub); margin-bottom: 16px; }
.savings-tag {
display: inline-block;
background: rgba(16,185,129,0.12);
color: var(--green);
font-size: 13px;
font-weight: 600;
padding: 4px 10px;
border-radius: 6px;
margin-bottom: 16px;
}
.plan-features { list-style: none; margin-bottom: 24px; }
.plan-features li {
padding: 7px 0;
font-size: 13px;
color: var(--sub);
display: flex;
align-items: center;
gap: 8px;
border-bottom: 1px solid rgba(255,255,255,0.04);
}
.plan-features li::before { content: "✓"; color: var(--green); font-weight: 700; font-size: 14px; flex-shrink: 0; }
.btn-plan {
width: 100%;
padding: 14px;
background: transparent;
border: 1.5px solid var(--purple);
color: var(--purple);
border-radius: 10px;
font-size: 15px;
font-weight: 700;
cursor: pointer;
transition: all 0.2s;
}
.btn-plan:hover:not(:disabled) { background: var(--purple); color: white; }
.btn-plan:disabled { opacity: 0.6; cursor: wait; }
.trial-notice {
max-width: 900px;
margin: 0 auto 16px;
text-align: center;
font-size: 13px;
color: var(--muted);
padding: 14px;
background: var(--panel);
border: 1px solid var(--border);
border-radius: 10px;
}
.trial-notice strong { color: var(--green); }
.page-footer { max-width: 900px; margin: 24px auto 0; text-align: center; font-size: 13px; color: var(--muted); }
.page-footer a { color: var(--sub); text-decoration: none; }
.page-footer a:hover { color: var(--text); }
@media (max-width: 640px) {
.lifetime-top { flex-direction: column; }
.lifetime-right { text-align: left; }
.lifetime-price { font-size: 44px; }
}
</style>
<link rel="canonical" href="https://nodus-ai.app/checkout" />
</head>
<body>
<nav>
<div class="nav-inner">
<a href="https://nodus-ai.app" class="nav-logo">NODUS</a>
<a href="https://nodus-ai.app" class="nav-back" id="t-nav-back">← Back to home</a>
</div>
</nav>
<div class="page-header">
<div class="ph-badge" id="t-ph-badge">🚀 Product Hunt Launch</div>
<h1 class="page-title" id="t-page-title">Unlock <span>NODUS PRO</span></h1>
<p class="page-sub" id="t-page-sub">Capture, organize and reuse your best AI conversations — forever.</p>
</div>
<div class="error-message" id="error-message"></div>
<!-- LIFETIME HERO -->
<div class="lifetime-card" id="lifetime-plan">
<div class="lifetime-top">
<div class="lifetime-left">
<div class="lifetime-badge" id="t-lt-badge">⚡ Early Access — Limited Offer</div>
<div class="lifetime-name" id="t-lt-name">Lifetime Access</div>
<div class="lifetime-desc" id="t-lt-desc">Pay once, use forever. All current and future PRO features — no subscriptions, no renewals. Only available during launch week.</div>
</div>
<div class="lifetime-right">
<div class="lifetime-price-old" id="t-lt-value">$108/year value</div>
<div class="lifetime-price">$79</div>
<div class="lifetime-once" id="t-lt-once">one-time payment</div>
<div class="lifetime-slots">
<span class="slot-dot"></span>
<span id="slots-label">Limited to 200 copies</span>
</div>
</div>
</div>
<div class="lifetime-features">
<div class="lf-item" id="t-f1">6 Custom Queues</div>
<div class="lf-item" id="t-f2">Full Chat Capture</div>
<div class="lf-item" id="t-f3">Inject Chain Feature</div>
<div class="lf-item" id="t-f4">HTML & DOCX Export</div>
<div class="lf-item" id="t-f5">Auto Capture</div>
<div class="lf-item" id="t-f6">Unlimited Projects</div>
<div class="lf-item" id="t-f7">Encrypted Backup</div>
<div class="lf-item" id="t-f8">Priority Support</div>
<div class="lf-item" id="t-f9">All Future Features</div>
</div>
<button class="btn-lifetime" id="btn-lifetime">⚡ Get Lifetime Access — $79</button>
<div class="btn-lifetime-sub" id="t-lt-sub">Secure payment via Paddle · Instant activation · 7-day refund guarantee</div>
</div>
<div class="or-divider" id="t-or">or choose a subscription</div>
<!-- SUBSCRIPTION PLANS -->
<div class="plans">
<div class="plan" id="monthly-plan">
<div class="plan-name" id="t-mo-name">Monthly</div>
<div class="plan-price">$4.50</div>
<div class="plan-period" id="t-mo-period">per month · cancel anytime</div>
<ul class="plan-features" id="t-mo-features">
<li>6 Custom Queues</li>
<li>Full Chat Capture</li>
<li>Inject Chain Feature</li>
<li>HTML & DOCX Export</li>
<li>Auto Capture</li>
<li>Priority Support</li>
</ul>
<button class="btn-plan" id="btn-monthly">Choose Monthly</button>
</div>
<div class="plan recommended" id="annual-plan">
<span class="badge-rec" id="t-save-badge">Save 44%</span>
<div class="plan-name" id="t-an-name">Annual</div>
<div class="plan-price">$30</div>
<div class="plan-period" id="t-an-period">per year · billed annually</div>
<div class="savings-tag" id="t-save-tag">💰 Save $24/year vs monthly</div>
<ul class="plan-features" id="t-an-features">
<li>6 Custom Queues</li>
<li>Full Chat Capture</li>
<li>Inject Chain Feature</li>
<li>HTML & DOCX Export</li>
<li>Auto Capture</li>
<li>Priority Support</li>
</ul>
<button class="btn-plan" id="btn-annual">Choose Annual</button>
</div>
</div>
<div class="trial-notice" id="t-trial">
<strong>🎉 14-Day Free Trial</strong> on monthly & annual plans — try NODUS PRO risk-free. Cancel anytime during the trial.
</div>
<div class="page-footer">
<span id="t-footer-support">Need help? <a href="mailto:support@nodus-ai.app">Contact Support</a></span>
· <a href="https://nodus-ai.app/refund" id="t-footer-refund">Refund Policy</a>
· <a href="https://nodus-ai.app/privacy" id="t-footer-privacy">Privacy</a>
</div>
<script>
// ─── I18N ───────────────────────────────────────────────
var LANG = (function() {
try { return localStorage.getItem('nodus_lang') || 'en'; } catch(e) { return 'en'; }
})();
var T = {
'page-title': { en:'Unlock <span>NODUS PRO</span>', pt:'Desbloqueie o <span>NODUS PRO</span>', es:'Desbloquea <span>NODUS PRO</span>', fr:'Débloquez <span>NODUS PRO</span>', de:'<span>NODUS PRO</span> freischalten', it:'Sblocca <span>NODUS PRO</span>', nl:'Ontgrendel <span>NODUS PRO</span>', pl:'Odblokuj <span>NODUS PRO</span>', id:'Buka Kunci <span>NODUS PRO</span>', vi:'Mở khóa <span>NODUS PRO</span>', ja:'<span>NODUS PRO</span> を解除', ko:'<span>NODUS PRO</span> 잠금 해제', zh:'解锁 <span>NODUS PRO</span>', ru:'Разблокировать <span>NODUS PRO</span>', hi:'<span>NODUS PRO</span> अनलॉक करें', tr:'<span>NODUS PRO</span>\'yu Aç' },
'nav-back': { en:'← Back to home', pt:'← Voltar ao início', es:'← Volver al inicio', fr:'← Retour', de:'← Zurück', it:'← Torna alla home', nl:'← Terug naar home', pl:'← Wróć do strony', id:'← Kembali', vi:'← Quay lại', ja:'← ホームへ', ko:'← 홈으로', zh:'← 返回首页', ru:'← На главную', hi:'← होम पर जाएं', tr:'← Ana sayfaya dön' },
'ph-badge': { en:'🚀 Product Hunt Launch', pt:'🚀 Lançamento no Product Hunt', es:'🚀 Lanzamiento en Product Hunt', fr:'🚀 Lancement Product Hunt', de:'🚀 Product Hunt Launch', it:'🚀 Lancio su Product Hunt', nl:'🚀 Product Hunt Launch', pl:'🚀 Premiera na Product Hunt', id:'🚀 Peluncuran Product Hunt', vi:'🚀 Ra mắt Product Hunt', ja:'🚀 Product Hunt 公開', ko:'🚀 프로덕트 헌트 출시', zh:'🚀 Product Hunt 发布', ru:'🚀 Запуск на Product Hunt', hi:'🚀 Product Hunt लॉन्च', tr:'🚀 Product Hunt Lansmanı' },
'page-sub': { en:'Capture, organize and reuse your best AI conversations — forever.', pt:'Capture, organize e reutilize suas melhores conversas de IA — para sempre.', es:'Captura, organiza y reutiliza tus mejores conversaciones de IA — para siempre.', fr:'Capturez, organisez et réutilisez vos meilleures conversations IA — pour toujours.', de:'Erfasse, organisiere und nutze deine besten KI-Gespräche — für immer.', it:'Cattura, organizza e riutilizza le tue migliori conversazioni IA — per sempre.', nl:'Leg vast, organiseer en hergebruik je beste AI-gesprekken — voor altijd.', pl:'Przechwytuj, organizuj i ponownie używaj najlepszych rozmów z AI — na zawsze.', id:'Tangkap, atur, dan gunakan kembali percakapan AI terbaik Anda — selamanya.', vi:'Ghi lại, tổ chức và tái sử dụng các cuộc trò chuyện AI hay nhất — mãi mãi.', ja:'最高のAI会話を保存・整理・再利用 — 永遠に。', ko:'최고의 AI 대화를 캡처하고 정리하고 재사용하세요 — 영원히.', zh:'永久捕获、整理和重用您最好的 AI 对话。', ru:'Сохраняйте, организуйте и повторно используйте лучшие AI-разговоры — навсегда.', hi:'अपनी सर्वश्रेष्ठ AI बातचीत को कैप्चर, व्यवस्थित और पुनः उपयोग करें — हमेशा के लिए।', tr:'En iyi AI sohbetlerinizi yakalayın, düzenleyin ve yeniden kullanın — sonsuza kadar.' },
'lt-badge': { en:'⚡ Early Access — Limited Offer', pt:'⚡ Acesso Antecipado — Oferta Limitada', es:'⚡ Acceso Anticipado — Oferta Limitada', fr:'⚡ Accès Anticipé — Offre Limitée', de:'⚡ Früher Zugang — Limitiertes Angebot', it:'⚡ Accesso Anticipato — Offerta Limitata', nl:'⚡ Vroege Toegang — Beperkt Aanbod', pl:'⚡ Wczesny Dostęp — Ograniczona Oferta', id:'⚡ Akses Awal — Penawaran Terbatas', vi:'⚡ Truy cập sớm — Ưu đãi có hạn', ja:'⚡ 先行アクセス — 限定オファー', ko:'⚡ 얼리 액세스 — 한정 혜택', zh:'⚡ 早期访问 — 限量优惠', ru:'⚡ Ранний доступ — Ограниченное предложение', hi:'⚡ अर्ली एक्सेस — सीमित ऑफर', tr:'⚡ Erken Erişim — Sınırlı Teklif' },
'lt-name': { en:'Lifetime Access', pt:'Acesso Vitalício', es:'Acceso de por Vida', fr:'Accès à Vie', de:'Lebenslanger Zugang', it:'Accesso a Vita', nl:'Levenslange Toegang', pl:'Dożywotni Dostęp', id:'Akses Seumur Hidup', vi:'Truy cập trọn đời', ja:'生涯アクセス', ko:'평생 이용권', zh:'终身访问', ru:'Пожизненный доступ', hi:'आजीवन एक्सेस', tr:'Ömür Boyu Erişim' },
'lt-desc': { en:'Pay once, use forever. All current and future PRO features — no subscriptions, no renewals. Only available during launch week.', pt:'Pague uma vez, use para sempre. Todos os recursos PRO atuais e futuros — sem assinaturas, sem renovações. Disponível apenas durante a semana de lançamento.', es:'Paga una vez, usa para siempre. Todas las funciones PRO actuales y futuras — sin suscripciones ni renovaciones. Solo disponible durante la semana de lanzamiento.', fr:'Payez une fois, utilisez pour toujours. Toutes les fonctionnalités PRO actuelles et futures — sans abonnements ni renouvellements. Disponible uniquement pendant la semaine de lancement.', de:'Einmal zahlen, für immer nutzen. Alle aktuellen und zukünftigen PRO-Funktionen — keine Abonnements, keine Verlängerungen. Nur in der Startwoche verfügbar.', it:'Paga una volta, usa per sempre. Tutte le funzionalità PRO attuali e future — nessun abbonamento, nessun rinnovo. Disponibile solo durante la settimana di lancio.', nl:'Eenmalig betalen, voor altijd gebruiken. Alle huidige en toekomstige PRO-functies — geen abonnementen, geen verlengingen. Alleen beschikbaar tijdens de lanceringweek.', pl:'Zapłać raz, używaj na zawsze. Wszystkie obecne i przyszłe funkcje PRO — bez subskrypcji, bez odnowień. Dostępne tylko w tygodniu premiery.', id:'Bayar sekali, gunakan selamanya. Semua fitur PRO saat ini dan mendatang — tanpa langganan, tanpa perpanjangan. Hanya tersedia selama minggu peluncuran.', vi:'Trả một lần, dùng mãi mãi. Tất cả tính năng PRO hiện tại và tương lai — không đăng ký, không gia hạn. Chỉ có trong tuần ra mắt.', ja:'一度支払えば永遠に使用可能。現在および将来のすべてのPRO機能 — サブスクリプション不要、更新不要。ローンチ週のみ提供。', ko:'한 번 결제로 영원히 사용. 현재 및 미래의 모든 PRO 기능 — 구독 없음, 갱신 없음. 출시 주에만 제공.', zh:'一次付款,永久使用。所有当前和未来的 PRO 功能 — 无订阅,无续费。仅在发布周提供。', ru:'Платите один раз, пользуйтесь вечно. Все текущие и будущие PRO-функции — без подписок и продлений. Доступно только в неделю запуска.', hi:'एक बार भुगतान करें, हमेशा के लिए उपयोग करें। सभी वर्तमान और भविष्य की PRO सुविधाएं — कोई सब्सक्रिप्शन नहीं, कोई नवीनीकरण नहीं। केवल लॉन्च सप्ताह के दौरान उपलब्ध।', tr:'Bir kez öde, sonsuza kadar kullan. Tüm mevcut ve gelecekteki PRO özellikleri — abonelik yok, yenileme yok. Yalnızca lansman haftasında mevcut.' },
'lt-value': { en:'$108/year value', pt:'Valor de $108/ano', es:'Valor de $108/año', fr:'Valeur de 108 $/an', de:'Wert: $108/Jahr', it:'Valore di $108/anno', nl:'Waarde $108/jaar', pl:'Wartość $108/rok', id:'Nilai $108/tahun', vi:'Giá trị $108/năm', ja:'年間$108相当', ko:'연간 $108 가치', zh:'价值 $108/年', ru:'Стоимость $108/год', hi:'$108/वर्ष का मूल्य', tr:'$108/yıl değerinde' },
'lt-once': { en:'one-time payment', pt:'pagamento único', es:'pago único', fr:'paiement unique', de:'Einmalzahlung', it:'pagamento unico', nl:'eenmalige betaling', pl:'jednorazowa płatność', id:'pembayaran sekali', vi:'thanh toán một lần', ja:'一括払い', ko:'일회성 결제', zh:'一次性付款', ru:'единовременный платёж', hi:'एकमुश्त भुगतान', tr:'tek seferlik ödeme' },
'slots-limited': { en:'Limited to 200 copies', pt:'Limitado a 200 cópias', es:'Limitado a 200 copias', fr:'Limité à 200 exemplaires', de:'Auf 200 Exemplare begrenzt', it:'Limitato a 200 copie', nl:'Beperkt tot 200 exemplaren', pl:'Ograniczone do 200 kopii', id:'Terbatas 200 salinan', vi:'Giới hạn 200 bản', ja:'200部限定', ko:'200개 한정', zh:'限量 200 份', ru:'Ограничено 200 копиями', hi:'200 प्रतियों तक सीमित', tr:'200 kopya ile sınırlı' },
'slots-remaining':{ en:' of 200 copies remaining', pt:' de 200 cópias restantes', es:' de 200 copias restantes', fr:' sur 200 exemplaires restants', de:' von 200 Exemplaren übrig', it:' di 200 copie rimanenti', nl:' van 200 exemplaren over', pl:' z 200 kopii pozostało', id:' dari 200 salinan tersisa', vi:' trong 200 bản còn lại', ja:' / 200部 残り', ko:' / 200개 남음', zh:' / 200 份剩余', ru:' из 200 осталось', hi:' / 200 प्रतियां शेष', tr:' / 200 kopya kaldı' },
'lt-btn': { en:'⚡ Get Lifetime Access — $79', pt:'⚡ Obter Acesso Vitalício — $79', es:'⚡ Obtener Acceso de por Vida — $79', fr:'⚡ Obtenir l\'Accès à Vie — 79 $', de:'⚡ Lebenslangen Zugang erhalten — $79', it:'⚡ Ottieni Accesso a Vita — $79', nl:'⚡ Levenslange Toegang — $79', pl:'⚡ Kup Dożywotni Dostęp — $79', id:'⚡ Dapatkan Akses Seumur Hidup — $79', vi:'⚡ Mua truy cập trọn đời — $79', ja:'⚡ 生涯アクセスを取得 — $79', ko:'⚡ 평생 이용권 구매 — $79', zh:'⚡ 获取终身访问权限 — $79', ru:'⚡ Получить пожизненный доступ — $79', hi:'⚡ आजीवन एक्सेस प्राप्त करें — $79', tr:'⚡ Ömür Boyu Erişim Al — $79' },
'lt-sub': { en:'Secure payment via Paddle · Instant activation · 7-day refund guarantee', pt:'Pagamento seguro via Paddle · Ativação imediata · 7 dias de garantia de reembolso', es:'Pago seguro via Paddle · Activación inmediata · Garantía de reembolso de 7 días', fr:'Paiement sécurisé via Paddle · Activation instantanée · Garantie de remboursement 7 jours', de:'Sichere Zahlung via Paddle · Sofortige Aktivierung · 7 Tage Geld-zurück-Garantie', it:'Pagamento sicuro via Paddle · Attivazione immediata · Garanzia di rimborso 7 giorni', nl:'Veilige betaling via Paddle · Directe activering · 7 dagen terugbetalingsgarantie', pl:'Bezpieczna płatność przez Paddle · Natychmiastowa aktywacja · 7-dniowa gwarancja zwrotu', id:'Pembayaran aman via Paddle · Aktivasi instan · Jaminan pengembalian 7 hari', vi:'Thanh toán bảo mật qua Paddle · Kích hoạt ngay · Hoàn tiền trong 7 ngày', ja:'Paddleによる安全な決済 · 即時アクティベーション · 7日間返金保証', ko:'Paddle 안전 결제 · 즉시 활성화 · 7일 환불 보장', zh:'通过 Paddle 安全付款 · 即时激活 · 7天退款保证', ru:'Безопасная оплата через Paddle · Мгновенная активация · 7-дневная гарантия возврата', hi:'Paddle के माध्यम से सुरक्षित भुगतान · तत्काल सक्रियण · 7-दिन की वापसी गारंटी', tr:'Paddle üzerinden güvenli ödeme · Anında aktivasyon · 7 günlük iade garantisi' },
'or': { en:'or choose a subscription', pt:'ou escolha uma assinatura', es:'o elige una suscripción', fr:'ou choisissez un abonnement', de:'oder wähle ein Abonnement', it:'o scegli un abbonamento', nl:'of kies een abonnement', pl:'lub wybierz subskrypcję', id:'atau pilih langganan', vi:'hoặc chọn gói đăng ký', ja:'またはサブスクリプションを選択', ko:'또는 구독 선택', zh:'或选择订阅方案', ru:'или выберите подписку', hi:'या सदस्यता चुनें', tr:'veya bir abonelik seçin' },
'mo-name': { en:'Monthly', pt:'Mensal', es:'Mensual', fr:'Mensuel', de:'Monatlich', it:'Mensile', nl:'Maandelijks', pl:'Miesięczny', id:'Bulanan', vi:'Hàng tháng', ja:'月払い', ko:'월간', zh:'月付', ru:'Ежемесячно', hi:'मासिक', tr:'Aylık' },
'mo-period': { en:'per month · cancel anytime', pt:'por mês · cancele quando quiser', es:'por mes · cancela cuando quieras', fr:'par mois · annulez à tout moment', de:'pro Monat · jederzeit kündbar', it:'al mese · annulla in qualsiasi momento', nl:'per maand · op elk moment opzeggen', pl:'miesięcznie · anuluj w dowolnym momencie', id:'per bulan · batalkan kapan saja', vi:'mỗi tháng · hủy bất cứ lúc nào', ja:'月払い · いつでもキャンセル可', ko:'월 · 언제든지 취소 가능', zh:'每月 · 随时取消', ru:'в месяц · отмена в любое время', hi:'प्रति माह · कभी भी रद्द करें', tr:'aylık · istediğiniz zaman iptal edin' },
'an-name': { en:'Annual', pt:'Anual', es:'Anual', fr:'Annuel', de:'Jährlich', it:'Annuale', nl:'Jaarlijks', pl:'Roczny', id:'Tahunan', vi:'Hàng năm', ja:'年払い', ko:'연간', zh:'年付', ru:'Ежегодно', hi:'वार्षिक', tr:'Yıllık' },
'an-period': { en:'per year · billed annually', pt:'por ano · cobrado anualmente', es:'por año · facturado anualmente', fr:'par an · facturé annuellement', de:'pro Jahr · jährlich abgerechnet', it:'all\'anno · fatturato annualmente', nl:'per jaar · jaarlijks gefactureerd', pl:'rocznie · rozliczane rocznie', id:'per tahun · ditagih tahunan', vi:'mỗi năm · thanh toán hàng năm', ja:'年払い · 年間一括請求', ko:'연 · 연간 청구', zh:'每年 · 按年计费', ru:'в год · ежегодное списание', hi:'प्रति वर्ष · वार्षिक बिलिंग', tr:'yıllık · yıllık faturalandırılır' },
'save-badge': { en:'Save 44%', pt:'Economize 44%', es:'Ahorra 44%', fr:'Économisez 44 %', de:'44 % sparen', it:'Risparmia 44%', nl:'Bespaar 44%', pl:'Oszczędź 44%', id:'Hemat 44%', vi:'Tiết kiệm 44%', ja:'44%お得', ko:'44% 절약', zh:'节省 44%', ru:'Экономия 44%', hi:'44% बचाएं', tr:'%44 tasarruf' },
'save-tag': { en:'💰 Save $24/year vs monthly', pt:'💰 Economize $24/ano vs mensal', es:'💰 Ahorra $24/año vs mensual', fr:'💰 Économisez 24 $/an vs mensuel', de:'💰 $24/Jahr sparen vs. monatlich', it:'💰 Risparmia $24/anno vs mensile', nl:'💰 Bespaar $24/jaar vs maandelijks', pl:'💰 Zaoszczędź $24/rok vs miesięczny', id:'💰 Hemat $24/tahun vs bulanan', vi:'💰 Tiết kiệm $24/năm so với hàng tháng', ja:'💰 月払いより年間$24お得', ko:'💰 월간보다 연간 $24 절약', zh:'💰 比月付每年节省 $24', ru:'💰 Экономия $24/год по сравнению с ежемесячной', hi:'💰 मासिक की तुलना में $24/वर्ष बचाएं', tr:'💰 Aylığa göre yılda $24 tasarruf' },
'mo-btn': { en:'Choose Monthly', pt:'Escolher Mensal', es:'Elegir Mensual', fr:'Choisir Mensuel', de:'Monatlich wählen', it:'Scegli Mensile', nl:'Kies Maandelijks', pl:'Wybierz Miesięczny', id:'Pilih Bulanan', vi:'Chọn hàng tháng', ja:'月払いを選択', ko:'월간 선택', zh:'选择月付', ru:'Выбрать ежемесячно', hi:'मासिक चुनें', tr:'Aylık Seç' },
'an-btn': { en:'Choose Annual', pt:'Escolher Anual', es:'Elegir Anual', fr:'Choisir Annuel', de:'Jährlich wählen', it:'Scegli Annuale', nl:'Kies Jaarlijks', pl:'Wybierz Roczny', id:'Pilih Tahunan', vi:'Chọn hàng năm', ja:'年払いを選択', ko:'연간 선택', zh:'选择年付', ru:'Выбрать ежегодно', hi:'वार्षिक चुनें', tr:'Yıllık Seç' },
'trial': { en:'<strong>🎉 14-Day Free Trial</strong> on monthly & annual plans — try NODUS PRO risk-free. Cancel anytime during the trial.', pt:'<strong>🎉 14 Dias Grátis</strong> nos planos mensal e anual — experimente o NODUS PRO sem risco. Cancele a qualquer momento durante o período de teste.', es:'<strong>🎉 14 Días de Prueba Gratis</strong> en planes mensual y anual — prueba NODUS PRO sin riesgo. Cancela en cualquier momento durante el período de prueba.', fr:'<strong>🎉 14 Jours d\'Essai Gratuit</strong> sur les plans mensuel et annuel — essayez NODUS PRO sans risque. Annulez à tout moment pendant l\'essai.', de:'<strong>🎉 14-tägige kostenlose Testphase</strong> bei monatlichen und jährlichen Plänen — testen Sie NODUS PRO risikofrei. Jederzeit während der Testphase kündbar.', it:'<strong>🎉 14 Giorni di Prova Gratuita</strong> sui piani mensile e annuale — prova NODUS PRO senza rischi. Annulla in qualsiasi momento durante la prova.', nl:'<strong>🎉 14 Dagen Gratis Proefperiode</strong> op maandelijkse en jaarlijkse plannen — probeer NODUS PRO risicovrij. Annuleer op elk moment tijdens de proefperiode.', pl:'<strong>🎉 14-dniowy bezpłatny okres próbny</strong> w planach miesięcznym i rocznym — wypróbuj NODUS PRO bez ryzyka. Anuluj w dowolnym momencie podczas próby.', id:'<strong>🎉 14 Hari Uji Coba Gratis</strong> pada paket bulanan & tahunan — coba NODUS PRO tanpa risiko. Batalkan kapan saja selama masa uji coba.', vi:'<strong>🎉 Dùng thử 14 ngày miễn phí</strong> trên các gói hàng tháng và hàng năm — thử NODUS PRO không rủi ro. Hủy bất cứ lúc nào trong thời gian dùng thử.', ja:'<strong>🎉 14日間無料トライアル</strong> 月払い・年払いプランで — リスクなしでNODUS PROをお試しください。試用期間中はいつでもキャンセル可能。', ko:'<strong>🎉 14일 무료 체험</strong> 월간 및 연간 플랜에서 — NODUS PRO를 무료로 체험하세요. 체험 기간 중 언제든지 취소 가능.', zh:'<strong>🎉 14天免费试用</strong> 月付和年付计划 — 无风险体验 NODUS PRO。试用期间随时取消。', ru:'<strong>🎉 14-дневный бесплатный пробный период</strong> для ежемесячных и годовых планов — попробуйте NODUS PRO без риска. Отменяйте в любое время в течение пробного периода.', hi:'<strong>🎉 14-दिन का मुफ्त ट्रायल</strong> मासिक और वार्षिक योजनाओं पर — जोखिम-मुक्त NODUS PRO आज़माएं। परीक्षण के दौरान कभी भी रद्द करें।', tr:'<strong>🎉 14 Günlük Ücretsiz Deneme</strong> aylık ve yıllık planlarda — NODUS PRO\'yu risksiz deneyin. Deneme süresi boyunca istediğiniz zaman iptal edin.' },
'footer-support': { en:'Need help? <a href="mailto:support@nodus-ai.app">Contact Support</a>', pt:'Precisa de ajuda? <a href="mailto:support@nodus-ai.app">Fale Conosco</a>', es:'¿Necesitas ayuda? <a href="mailto:support@nodus-ai.app">Contactar Soporte</a>', fr:'Besoin d\'aide ? <a href="mailto:support@nodus-ai.app">Contacter le support</a>', de:'Benötigen Sie Hilfe? <a href="mailto:support@nodus-ai.app">Support kontaktieren</a>', it:'Hai bisogno di aiuto? <a href="mailto:support@nodus-ai.app">Contatta il supporto</a>', nl:'Hulp nodig? <a href="mailto:support@nodus-ai.app">Contact opnemen</a>', pl:'Potrzebujesz pomocy? <a href="mailto:support@nodus-ai.app">Skontaktuj się</a>', id:'Butuh bantuan? <a href="mailto:support@nodus-ai.app">Hubungi Dukungan</a>', vi:'Cần giúp đỡ? <a href="mailto:support@nodus-ai.app">Liên hệ hỗ trợ</a>', ja:'お困りですか?<a href="mailto:support@nodus-ai.app">サポートに連絡</a>', ko:'도움이 필요하신가요? <a href="mailto:support@nodus-ai.app">지원팀 문의</a>', zh:'需要帮助?<a href="mailto:support@nodus-ai.app">联系支持</a>', ru:'Нужна помощь? <a href="mailto:support@nodus-ai.app">Связаться с поддержкой</a>', hi:'सहायता चाहिए? <a href="mailto:support@nodus-ai.app">सहायता से संपर्क करें</a>', tr:'Yardıma mı ihtiyacınız var? <a href="mailto:support@nodus-ai.app">Destek ile İletişim</a>' },
'footer-refund': { en:'Refund Policy', pt:'Política de Reembolso', es:'Política de Reembolso', fr:'Politique de remboursement', de:'Rückgaberecht', it:'Politica di rimborso', nl:'Terugbetalingsbeleid', pl:'Polityka zwrotów', id:'Kebijakan Pengembalian', vi:'Chính sách hoàn tiền', ja:'返金ポリシー', ko:'환불 정책', zh:'退款政策', ru:'Политика возврата', hi:'वापसी नीति', tr:'İade Politikası' },
'footer-privacy': { en:'Privacy', pt:'Privacidade', es:'Privacidad', fr:'Confidentialité', de:'Datenschutz', it:'Privacy', nl:'Privacy', pl:'Prywatność', id:'Privasi', vi:'Quyền riêng tư', ja:'プライバシー', ko:'개인정보', zh:'隐私', ru:'Конфиденциальность', hi:'गोपनीयता', tr:'Gizlilik' }
};
function t(key) {
var map = T[key];
if (!map) return '';
return map[LANG] || map['en'] || '';
}
function applyTranslations() {
var ids = {
't-page-title': 'page-title',
't-nav-back': 'nav-back',
't-ph-badge': 'ph-badge',
't-page-sub': 'page-sub',
't-lt-badge': 'lt-badge',
't-lt-name': 'lt-name',
't-lt-desc': 'lt-desc',
't-lt-value': 'lt-value',
't-lt-once': 'lt-once',
'slots-label': 'slots-limited',
't-or': 'or',
't-mo-name': 'mo-name',
't-mo-period': 'mo-period',
't-an-name': 'an-name',
't-an-period': 'an-period',
't-save-badge': 'save-badge',
't-save-tag': 'save-tag',
't-save-badge': 'save-badge',
't-trial': 'trial',
't-footer-refund': 'footer-refund',
't-footer-privacy':'footer-privacy'
};
for (var id in ids) {
var el = document.getElementById(id);
if (!el) continue;
var val = t(ids[id]);
if (!val) continue;
if (id === 't-trial' || id === 't-footer-support' || id === 't-page-title') {
el.innerHTML = val;
} else {
el.textContent = val;
}
}
// Botões
var btnLt = document.getElementById('btn-lifetime');
if (btnLt) btnLt.textContent = t('lt-btn');
var btnMo = document.getElementById('btn-monthly');
if (btnMo) btnMo.textContent = t('mo-btn');
var btnAn = document.getElementById('btn-annual');
if (btnAn) btnAn.textContent = t('an-btn');
var ltSub = document.getElementById('t-lt-sub');
if (ltSub) ltSub.textContent = t('lt-sub');
var footerSupport = document.getElementById('t-footer-support');
if (footerSupport) footerSupport.innerHTML = t('footer-support');
// html lang
document.documentElement.lang = LANG;
}
// ─── PADDLE ─────────────────────────────────────────────
var PADDLE_LOCALE_MAP = {
pt:'pt', es:'es', fr:'fr', de:'de', it:'it', nl:'nl',
pl:'pl', ja:'ja', ko:'ko', zh:'zh', ru:'ru'
};
var PADDLE_CONFIG = {
token: 'live_d9e30b48721ea8b2a1ac2c3a895',
environment: 'production',
prices: {
monthly: 'pri_01ked0qxgaszr7q9kgg8j91ha5',
annual: 'pri_01ked0sqxfpz1g6k2acgx2qrxq',
lifetime: 'pri_01kppkhz302jpmqhxmyf3x0jfj'
}
};
var paddleInitialized = false;
// ─── AFFILIATE REF ───────────────────────────────────────
var AFFILIATE_REF = (function() {
try {
var urlRef = new URLSearchParams(window.location.search).get('ref');
if (urlRef) { localStorage.setItem('nodus_ref', urlRef.toUpperCase()); return urlRef.toUpperCase(); }
return localStorage.getItem('nodus_ref') || null;
} catch(e) { return null; }
})();
function showError(message) {
var el = document.getElementById('error-message');
el.textContent = message;
el.style.display = 'block';
setTimeout(function() { el.style.display = 'none'; }, 6000);
}
function setLoading(btn, loading, original) {
btn.disabled = loading;
btn.textContent = loading ? '...' : original;
}
function initializePaddle() {
if (paddleInitialized) return Promise.resolve();
return new Promise(function(resolve, reject) {
try {
Paddle.Environment.set(PADDLE_CONFIG.environment);
Paddle.Initialize({
token: PADDLE_CONFIG.token,
eventCallback: function(data) {
if (data.name === 'checkout.completed') {
window.location.href = 'https://nodus-ai.app?checkout=success';
}
if (data.name === 'checkout.error') {
showError('Payment failed. Please try again.');
}
}
});
paddleInitialized = true;
resolve();
} catch(e) { reject(e); }
});
}
function buyPlan(plan) {
var btn = document.getElementById('btn-' + plan);
var original = btn.textContent;
setLoading(btn, true, original);
initializePaddle().then(function() {
var priceId = PADDLE_CONFIG.prices[plan];
if (!priceId) throw new Error('Invalid plan');
var locale = PADDLE_LOCALE_MAP[LANG] || 'en';
var checkoutOptions = {
items: [{ priceId: priceId, quantity: 1 }],
settings: {
displayMode: 'overlay',
theme: 'dark',
locale: locale,
successUrl: 'https://nodus-ai.app?checkout=success',
allowLogout: false
}
};
if (AFFILIATE_REF) {
checkoutOptions.customData = { ref: AFFILIATE_REF };
// Desconto só no plano anual (o código do afiliado = discount code no Paddle)
if (plan === 'annual') checkoutOptions.discountCode = AFFILIATE_REF;
}
Paddle.Checkout.open(checkoutOptions);
setTimeout(function() { setLoading(btn, false, original); }, 1000);
}).catch(function(e) {
console.error('[Checkout]', e);
showError('Failed to start checkout. Please try again.');
setLoading(btn, false, original);
});
}
// ─── INIT ────────────────────────────────────────────────
document.addEventListener('DOMContentLoaded', function() {
applyTranslations();
// Slots ao vivo
fetch('https://nodus-worker.mmcarvalho-dev.workers.dev/lifetime/slots')
.then(function(r) { return r.ok ? r.json() : null; })
.then(function(data) {
if (data && typeof data.remaining === 'number') {
var el = document.getElementById('slots-label');
if (el) el.textContent = data.remaining + t('slots-remaining');
}
}).catch(function() {});
initializePaddle().catch(function() {
showError('Failed to load payment system. Please refresh.');
});
document.getElementById('btn-lifetime').addEventListener('click', function() { buyPlan('lifetime'); });
document.getElementById('btn-monthly').addEventListener('click', function() { buyPlan('monthly'); });
document.getElementById('btn-annual').addEventListener('click', function() { buyPlan('annual'); });
document.getElementById('lifetime-plan').addEventListener('click', function(e) {
if (!e.target.closest('.btn-lifetime')) document.getElementById('btn-lifetime').click();
});
document.getElementById('monthly-plan').addEventListener('click', function(e) {
if (!e.target.closest('.btn-plan')) document.getElementById('btn-monthly').click();
});
document.getElementById('annual-plan').addEventListener('click', function(e) {
if (!e.target.closest('.btn-plan')) document.getElementById('btn-annual').click();
});
var params = new URLSearchParams(window.location.search);
if (params.get('checkout') === 'success') {
alert('🎉 ' + (LANG === 'pt' ? 'Obrigado pela compra! Verifique seu email para ativar o NODUS PRO.' : 'Thank you! Check your email to activate NODUS PRO.'));
}
if (params.get('error') === 'payment_failed') {
showError('Payment was not completed. Please try again.');
}
});
</script>
</body>
</html>