|
|
<!DOCTYPE html> |
|
|
<html lang="ro"> |
|
|
<head> |
|
|
<meta charset="utf-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|
|
<title>RetroPlay Giveaways - Steam Keys & Premii</title> |
|
|
<meta name="description" content="Giveaways RetroPlay cu Steam Keys și premii. Îndeplinește task-urile și participă."> |
|
|
<style> |
|
|
:root { |
|
|
--bg-dark: #0a0e1a; |
|
|
--bg-card: #111827; |
|
|
--bg-card-hover: #1a2332; |
|
|
--accent-primary: #6366f1; |
|
|
--accent-secondary: #8b5cf6; |
|
|
--accent-success: #10b981; |
|
|
--accent-warning: #f59e0b; |
|
|
--accent-danger: #ef4444; |
|
|
--text-primary: #f9fafb; |
|
|
--text-secondary: #9ca3af; |
|
|
--text-muted: #6b7280; |
|
|
--border: rgba(255,255,255,0.08); |
|
|
--border-hover: rgba(255,255,255,0.15); |
|
|
--shadow-sm: 0 1px 3px rgba(0,0,0,0.3); |
|
|
--shadow-md: 0 4px 12px rgba(0,0,0,0.4); |
|
|
--shadow-lg: 0 10px 40px rgba(0,0,0,0.5); |
|
|
--radius-sm: 8px; |
|
|
--radius-md: 12px; |
|
|
--radius-lg: 16px; |
|
|
--transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); |
|
|
} |
|
|
|
|
|
* { |
|
|
margin: 0; |
|
|
padding: 0; |
|
|
box-sizing: border-box; |
|
|
} |
|
|
|
|
|
body { |
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; |
|
|
background: linear-gradient(135deg, #0a0e1a 0%, #1a1f35 50%, #0f1424 100%); |
|
|
background-attachment: fixed; |
|
|
color: var(--text-primary); |
|
|
min-height: 100vh; |
|
|
overflow-x: hidden; |
|
|
} |
|
|
|
|
|
|
|
|
.navbar { |
|
|
position: sticky; |
|
|
top: 0; |
|
|
z-index: 100; |
|
|
background: rgba(17, 24, 39, 0.8); |
|
|
backdrop-filter: blur(20px); |
|
|
border-bottom: 1px solid var(--border); |
|
|
box-shadow: var(--shadow-md); |
|
|
} |
|
|
|
|
|
.nav-container { |
|
|
max-width: 1400px; |
|
|
margin: 0 auto; |
|
|
padding: 1rem 1.5rem; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 2rem; |
|
|
} |
|
|
|
|
|
.nav-logo { |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 0.75rem; |
|
|
text-decoration: none; |
|
|
color: var(--text-primary); |
|
|
} |
|
|
|
|
|
.nav-logo img { |
|
|
width: 40px; |
|
|
height: 40px; |
|
|
border-radius: var(--radius-sm); |
|
|
border: 1px solid var(--border); |
|
|
} |
|
|
|
|
|
.nav-logo-text h1 { |
|
|
font-size: 1.25rem; |
|
|
font-weight: 800; |
|
|
background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); |
|
|
-webkit-background-clip: text; |
|
|
-webkit-text-fill-color: transparent; |
|
|
} |
|
|
|
|
|
.nav-logo-text p { |
|
|
font-size: 0.75rem; |
|
|
color: var(--text-muted); |
|
|
} |
|
|
|
|
|
.nav-links { |
|
|
display: flex; |
|
|
gap: 0.5rem; |
|
|
flex: 1; |
|
|
} |
|
|
|
|
|
.nav-link { |
|
|
padding: 0.5rem 1rem; |
|
|
border-radius: var(--radius-sm); |
|
|
color: var(--text-secondary); |
|
|
text-decoration: none; |
|
|
font-weight: 600; |
|
|
font-size: 0.9rem; |
|
|
transition: all var(--transition); |
|
|
position: relative; |
|
|
} |
|
|
|
|
|
.nav-link:hover { |
|
|
color: var(--text-primary); |
|
|
background: rgba(255,255,255,0.05); |
|
|
} |
|
|
|
|
|
.nav-link.active { |
|
|
color: var(--accent-primary); |
|
|
background: rgba(99,102,241,0.1); |
|
|
} |
|
|
|
|
|
.nav-actions { |
|
|
display: flex; |
|
|
gap: 0.75rem; |
|
|
align-items: center; |
|
|
} |
|
|
|
|
|
.btn-nav { |
|
|
padding: 0.6rem 1.25rem; |
|
|
border-radius: var(--radius-sm); |
|
|
font-weight: 600; |
|
|
font-size: 0.9rem; |
|
|
cursor: pointer; |
|
|
border: none; |
|
|
transition: all var(--transition); |
|
|
display: inline-flex; |
|
|
align-items: center; |
|
|
gap: 0.5rem; |
|
|
text-decoration: none; |
|
|
} |
|
|
|
|
|
.btn-primary { |
|
|
background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); |
|
|
color: white; |
|
|
box-shadow: 0 4px 12px rgba(99,102,241,0.3); |
|
|
} |
|
|
|
|
|
.btn-primary:hover { |
|
|
transform: translateY(-2px); |
|
|
box-shadow: 0 6px 20px rgba(99,102,241,0.4); |
|
|
} |
|
|
|
|
|
.btn-secondary { |
|
|
background: var(--bg-card); |
|
|
color: var(--text-primary); |
|
|
border: 1px solid var(--border); |
|
|
} |
|
|
|
|
|
.btn-secondary:hover { |
|
|
background: var(--bg-card-hover); |
|
|
border-color: var(--border-hover); |
|
|
} |
|
|
|
|
|
|
|
|
.container { |
|
|
max-width: 1400px; |
|
|
margin: 0 auto; |
|
|
padding: 2rem 1.5rem; |
|
|
} |
|
|
|
|
|
|
|
|
.hero { |
|
|
padding: 3rem 0; |
|
|
text-align: center; |
|
|
position: relative; |
|
|
overflow: hidden; |
|
|
} |
|
|
|
|
|
.hero::before { |
|
|
content: ''; |
|
|
position: absolute; |
|
|
top: -50%; |
|
|
left: -50%; |
|
|
width: 200%; |
|
|
height: 200%; |
|
|
background: radial-gradient(circle, rgba(99,102,241,0.1) 0%, transparent 70%); |
|
|
animation: pulse 15s ease-in-out infinite; |
|
|
} |
|
|
|
|
|
@keyframes pulse { |
|
|
0%, 100% { transform: scale(1); opacity: 0.3; } |
|
|
50% { transform: scale(1.2); opacity: 0.5; } |
|
|
} |
|
|
|
|
|
.hero-content { |
|
|
position: relative; |
|
|
z-index: 1; |
|
|
} |
|
|
|
|
|
.hero h2 { |
|
|
font-size: 3rem; |
|
|
font-weight: 900; |
|
|
margin-bottom: 1rem; |
|
|
background: linear-gradient(135deg, #fff, #a5b4fc); |
|
|
-webkit-background-clip: text; |
|
|
-webkit-text-fill-color: transparent; |
|
|
} |
|
|
|
|
|
.hero p { |
|
|
font-size: 1.25rem; |
|
|
color: var(--text-secondary); |
|
|
max-width: 600px; |
|
|
margin: 0 auto 2rem; |
|
|
} |
|
|
|
|
|
.stats { |
|
|
display: flex; |
|
|
gap: 2rem; |
|
|
justify-content: center; |
|
|
flex-wrap: wrap; |
|
|
} |
|
|
|
|
|
.stat-item { |
|
|
background: var(--bg-card); |
|
|
border: 1px solid var(--border); |
|
|
border-radius: var(--radius-md); |
|
|
padding: 1.5rem 2rem; |
|
|
min-width: 150px; |
|
|
transition: all var(--transition); |
|
|
} |
|
|
|
|
|
.stat-item:hover { |
|
|
transform: translateY(-4px); |
|
|
border-color: var(--border-hover); |
|
|
box-shadow: var(--shadow-lg); |
|
|
} |
|
|
|
|
|
.stat-value { |
|
|
font-size: 2rem; |
|
|
font-weight: 900; |
|
|
background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); |
|
|
-webkit-background-clip: text; |
|
|
-webkit-text-fill-color: transparent; |
|
|
} |
|
|
|
|
|
.stat-label { |
|
|
color: var(--text-muted); |
|
|
font-size: 0.9rem; |
|
|
margin-top: 0.25rem; |
|
|
} |
|
|
|
|
|
|
|
|
.filters { |
|
|
background: var(--bg-card); |
|
|
border: 1px solid var(--border); |
|
|
border-radius: var(--radius-lg); |
|
|
padding: 1.5rem; |
|
|
margin-bottom: 2rem; |
|
|
box-shadow: var(--shadow-md); |
|
|
} |
|
|
|
|
|
.filter-group { |
|
|
margin-bottom: 1.5rem; |
|
|
} |
|
|
|
|
|
.filter-group:last-child { |
|
|
margin-bottom: 0; |
|
|
} |
|
|
|
|
|
.filter-label { |
|
|
font-weight: 700; |
|
|
font-size: 0.9rem; |
|
|
color: var(--text-secondary); |
|
|
margin-bottom: 0.75rem; |
|
|
display: block; |
|
|
text-transform: uppercase; |
|
|
letter-spacing: 0.5px; |
|
|
} |
|
|
|
|
|
.filter-options { |
|
|
display: flex; |
|
|
gap: 0.5rem; |
|
|
flex-wrap: wrap; |
|
|
} |
|
|
|
|
|
.filter-chip { |
|
|
padding: 0.5rem 1rem; |
|
|
border-radius: var(--radius-sm); |
|
|
background: rgba(255,255,255,0.05); |
|
|
border: 1px solid var(--border); |
|
|
color: var(--text-secondary); |
|
|
cursor: pointer; |
|
|
transition: all var(--transition); |
|
|
font-size: 0.9rem; |
|
|
font-weight: 600; |
|
|
display: inline-flex; |
|
|
align-items: center; |
|
|
gap: 0.5rem; |
|
|
} |
|
|
|
|
|
.filter-chip:hover { |
|
|
background: rgba(255,255,255,0.08); |
|
|
border-color: var(--border-hover); |
|
|
color: var(--text-primary); |
|
|
} |
|
|
|
|
|
.filter-chip.active { |
|
|
background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); |
|
|
border-color: transparent; |
|
|
color: white; |
|
|
box-shadow: 0 4px 12px rgba(99,102,241,0.3); |
|
|
} |
|
|
|
|
|
.platform-icon { |
|
|
width: 18px; |
|
|
height: 18px; |
|
|
object-fit: contain; |
|
|
} |
|
|
|
|
|
.search-box { |
|
|
position: relative; |
|
|
width: 100%; |
|
|
max-width: 400px; |
|
|
} |
|
|
|
|
|
.search-input { |
|
|
width: 100%; |
|
|
padding: 0.75rem 1rem 0.75rem 2.75rem; |
|
|
border-radius: var(--radius-md); |
|
|
background: rgba(255,255,255,0.05); |
|
|
border: 1px solid var(--border); |
|
|
color: var(--text-primary); |
|
|
font-size: 0.95rem; |
|
|
transition: all var(--transition); |
|
|
} |
|
|
|
|
|
.search-input:focus { |
|
|
outline: none; |
|
|
border-color: var(--accent-primary); |
|
|
background: rgba(255,255,255,0.08); |
|
|
box-shadow: 0 0 0 3px rgba(99,102,241,0.1); |
|
|
} |
|
|
|
|
|
.search-icon { |
|
|
position: absolute; |
|
|
left: 1rem; |
|
|
top: 50%; |
|
|
transform: translateY(-50%); |
|
|
color: var(--text-muted); |
|
|
pointer-events: none; |
|
|
} |
|
|
|
|
|
|
|
|
.giveaways-grid { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); |
|
|
gap: 1.5rem; |
|
|
margin-top: 2rem; |
|
|
} |
|
|
|
|
|
|
|
|
.giveaway-card { |
|
|
background: var(--bg-card); |
|
|
border: 1px solid var(--border); |
|
|
border-radius: var(--radius-lg); |
|
|
overflow: hidden; |
|
|
transition: all var(--transition); |
|
|
cursor: pointer; |
|
|
position: relative; |
|
|
box-shadow: var(--shadow-md); |
|
|
} |
|
|
|
|
|
.giveaway-card::before { |
|
|
content: ''; |
|
|
position: absolute; |
|
|
top: 0; |
|
|
left: 0; |
|
|
right: 0; |
|
|
height: 3px; |
|
|
background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); |
|
|
transform: scaleX(0); |
|
|
transition: transform var(--transition); |
|
|
} |
|
|
|
|
|
.giveaway-card:hover { |
|
|
transform: translateY(-8px); |
|
|
border-color: var(--border-hover); |
|
|
box-shadow: var(--shadow-lg); |
|
|
} |
|
|
|
|
|
.giveaway-card:hover::before { |
|
|
transform: scaleX(1); |
|
|
} |
|
|
|
|
|
.card-banner { |
|
|
position: relative; |
|
|
width: 100%; |
|
|
aspect-ratio: 16/9; |
|
|
overflow: hidden; |
|
|
background: linear-gradient(135deg, #1a1f35, #0f1424); |
|
|
} |
|
|
|
|
|
.card-banner img { |
|
|
width: 100%; |
|
|
height: 100%; |
|
|
object-fit: cover; |
|
|
transition: transform 0.4s ease; |
|
|
} |
|
|
|
|
|
.giveaway-card:hover .card-banner img { |
|
|
transform: scale(1.1); |
|
|
} |
|
|
|
|
|
.card-timer { |
|
|
position: absolute; |
|
|
bottom: 0.75rem; |
|
|
left: 0.75rem; |
|
|
right: 0.75rem; |
|
|
padding: 0.5rem 1rem; |
|
|
border-radius: var(--radius-sm); |
|
|
background: rgba(0,0,0,0.8); |
|
|
backdrop-filter: blur(10px); |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
gap: 0.5rem; |
|
|
font-weight: 700; |
|
|
font-size: 0.9rem; |
|
|
border: 1px solid rgba(255,255,255,0.1); |
|
|
} |
|
|
|
|
|
.card-platform { |
|
|
position: absolute; |
|
|
top: 0.75rem; |
|
|
right: 0.75rem; |
|
|
width: 36px; |
|
|
height: 36px; |
|
|
border-radius: var(--radius-sm); |
|
|
background: rgba(0,0,0,0.8); |
|
|
backdrop-filter: blur(10px); |
|
|
display: grid; |
|
|
place-items: center; |
|
|
border: 1px solid rgba(255,255,255,0.1); |
|
|
} |
|
|
|
|
|
.card-platform img { |
|
|
width: 20px; |
|
|
height: 20px; |
|
|
} |
|
|
|
|
|
.card-badge { |
|
|
position: absolute; |
|
|
top: 0.75rem; |
|
|
left: 0.75rem; |
|
|
padding: 0.35rem 0.75rem; |
|
|
border-radius: var(--radius-sm); |
|
|
background: rgba(0,0,0,0.8); |
|
|
backdrop-filter: blur(10px); |
|
|
font-size: 0.75rem; |
|
|
font-weight: 700; |
|
|
text-transform: uppercase; |
|
|
letter-spacing: 0.5px; |
|
|
border: 1px solid rgba(255,255,255,0.1); |
|
|
} |
|
|
|
|
|
.badge-new { |
|
|
background: linear-gradient(135deg, var(--accent-success), #059669); |
|
|
border: none; |
|
|
box-shadow: 0 4px 12px rgba(16,185,129,0.3); |
|
|
} |
|
|
|
|
|
.card-body { |
|
|
padding: 1.25rem; |
|
|
} |
|
|
|
|
|
.card-title { |
|
|
font-size: 1.25rem; |
|
|
font-weight: 800; |
|
|
margin-bottom: 0.5rem; |
|
|
color: var(--text-primary); |
|
|
display: -webkit-box; |
|
|
-webkit-line-clamp: 2; |
|
|
-webkit-box-orient: vertical; |
|
|
overflow: hidden; |
|
|
} |
|
|
|
|
|
.card-desc { |
|
|
color: var(--text-secondary); |
|
|
font-size: 0.9rem; |
|
|
line-height: 1.5; |
|
|
margin-bottom: 1rem; |
|
|
display: -webkit-box; |
|
|
-webkit-line-clamp: 2; |
|
|
-webkit-box-orient: vertical; |
|
|
overflow: hidden; |
|
|
} |
|
|
|
|
|
.card-tags { |
|
|
display: flex; |
|
|
gap: 0.5rem; |
|
|
flex-wrap: wrap; |
|
|
margin-bottom: 1rem; |
|
|
} |
|
|
|
|
|
.tag { |
|
|
padding: 0.25rem 0.75rem; |
|
|
border-radius: var(--radius-sm); |
|
|
font-size: 0.75rem; |
|
|
font-weight: 600; |
|
|
text-transform: uppercase; |
|
|
letter-spacing: 0.3px; |
|
|
} |
|
|
|
|
|
.tag-raffle { |
|
|
background: rgba(99,102,241,0.2); |
|
|
color: #a5b4fc; |
|
|
} |
|
|
|
|
|
.tag-aaa { |
|
|
background: rgba(245,158,11,0.2); |
|
|
color: #fbbf24; |
|
|
} |
|
|
|
|
|
.tag-indie { |
|
|
background: rgba(16,185,129,0.2); |
|
|
color: #6ee7b7; |
|
|
} |
|
|
|
|
|
.card-stats { |
|
|
display: flex; |
|
|
justify-content: space-between; |
|
|
padding-top: 1rem; |
|
|
border-top: 1px solid var(--border); |
|
|
} |
|
|
|
|
|
.card-stat { |
|
|
text-align: center; |
|
|
} |
|
|
|
|
|
.card-stat-value { |
|
|
font-size: 1.25rem; |
|
|
font-weight: 800; |
|
|
color: var(--accent-primary); |
|
|
} |
|
|
|
|
|
.card-stat-label { |
|
|
font-size: 0.75rem; |
|
|
color: var(--text-muted); |
|
|
margin-top: 0.25rem; |
|
|
} |
|
|
|
|
|
|
|
|
.skeleton { |
|
|
background: linear-gradient(90deg, rgba(255,255,255,0.05) 25%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0.05) 75%); |
|
|
background-size: 200% 100%; |
|
|
animation: shimmer 1.5s infinite; |
|
|
} |
|
|
|
|
|
@keyframes shimmer { |
|
|
0% { background-position: 200% 0; } |
|
|
100% { background-position: -200% 0; } |
|
|
} |
|
|
|
|
|
.skeleton-card { |
|
|
background: var(--bg-card); |
|
|
border: 1px solid var(--border); |
|
|
border-radius: var(--radius-lg); |
|
|
overflow: hidden; |
|
|
} |
|
|
|
|
|
.skeleton-banner { |
|
|
width: 100%; |
|
|
aspect-ratio: 16/9; |
|
|
} |
|
|
|
|
|
.skeleton-body { |
|
|
padding: 1.25rem; |
|
|
} |
|
|
|
|
|
.skeleton-title { |
|
|
height: 24px; |
|
|
border-radius: 4px; |
|
|
margin-bottom: 0.75rem; |
|
|
width: 80%; |
|
|
} |
|
|
|
|
|
.skeleton-text { |
|
|
height: 16px; |
|
|
border-radius: 4px; |
|
|
margin-bottom: 0.5rem; |
|
|
} |
|
|
|
|
|
|
|
|
.modal { |
|
|
position: fixed; |
|
|
inset: 0; |
|
|
background: rgba(0,0,0,0.8); |
|
|
backdrop-filter: blur(4px); |
|
|
z-index: 1000; |
|
|
display: none; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
padding: 1rem; |
|
|
animation: fadeIn 0.3s ease; |
|
|
} |
|
|
|
|
|
.modal.show { |
|
|
display: flex; |
|
|
} |
|
|
|
|
|
@keyframes fadeIn { |
|
|
from { opacity: 0; } |
|
|
to { opacity: 1; } |
|
|
} |
|
|
|
|
|
.modal-content { |
|
|
background: var(--bg-card); |
|
|
border: 1px solid var(--border); |
|
|
border-radius: var(--radius-lg); |
|
|
max-width: 900px; |
|
|
width: 100%; |
|
|
max-height: 90vh; |
|
|
overflow-y: auto; |
|
|
box-shadow: var(--shadow-lg); |
|
|
animation: slideUp 0.3s ease; |
|
|
} |
|
|
|
|
|
@keyframes slideUp { |
|
|
from { transform: translateY(20px); opacity: 0; } |
|
|
to { transform: translateY(0); opacity: 1; } |
|
|
} |
|
|
|
|
|
.modal-header { |
|
|
position: sticky; |
|
|
top: 0; |
|
|
background: var(--bg-card); |
|
|
border-bottom: 1px solid var(--border); |
|
|
padding: 1.5rem; |
|
|
display: flex; |
|
|
justify-content: space-between; |
|
|
align-items: center; |
|
|
z-index: 10; |
|
|
} |
|
|
|
|
|
.modal-close { |
|
|
width: 36px; |
|
|
height: 36px; |
|
|
border-radius: var(--radius-sm); |
|
|
background: rgba(255,255,255,0.05); |
|
|
border: 1px solid var(--border); |
|
|
color: var(--text-primary); |
|
|
cursor: pointer; |
|
|
display: grid; |
|
|
place-items: center; |
|
|
transition: all var(--transition); |
|
|
} |
|
|
|
|
|
.modal-close:hover { |
|
|
background: rgba(255,255,255,0.1); |
|
|
border-color: var(--border-hover); |
|
|
} |
|
|
|
|
|
.modal-body { |
|
|
padding: 1.5rem; |
|
|
} |
|
|
|
|
|
|
|
|
.login-container { |
|
|
min-height: 100vh; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
padding: 2rem; |
|
|
} |
|
|
|
|
|
.login-box { |
|
|
background: var(--bg-card); |
|
|
border: 1px solid var(--border); |
|
|
border-radius: var(--radius-lg); |
|
|
padding: 3rem; |
|
|
max-width: 500px; |
|
|
width: 100%; |
|
|
box-shadow: var(--shadow-lg); |
|
|
} |
|
|
|
|
|
.login-header { |
|
|
text-align: center; |
|
|
margin-bottom: 2rem; |
|
|
} |
|
|
|
|
|
.login-header h2 { |
|
|
font-size: 2rem; |
|
|
font-weight: 900; |
|
|
margin-bottom: 0.5rem; |
|
|
background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); |
|
|
-webkit-background-clip: text; |
|
|
-webkit-text-fill-color: transparent; |
|
|
} |
|
|
|
|
|
.login-header p { |
|
|
color: var(--text-secondary); |
|
|
} |
|
|
|
|
|
.form-group { |
|
|
margin-bottom: 1.5rem; |
|
|
} |
|
|
|
|
|
.form-label { |
|
|
display: block; |
|
|
margin-bottom: 0.5rem; |
|
|
font-weight: 600; |
|
|
color: var(--text-secondary); |
|
|
} |
|
|
|
|
|
.form-input { |
|
|
width: 100%; |
|
|
padding: 0.75rem 1rem; |
|
|
border-radius: var(--radius-sm); |
|
|
background: rgba(255,255,255,0.05); |
|
|
border: 1px solid var(--border); |
|
|
color: var(--text-primary); |
|
|
font-size: 1rem; |
|
|
transition: all var(--transition); |
|
|
} |
|
|
|
|
|
.form-input:focus { |
|
|
outline: none; |
|
|
border-color: var(--accent-primary); |
|
|
background: rgba(255,255,255,0.08); |
|
|
box-shadow: 0 0 0 3px rgba(99,102,241,0.1); |
|
|
} |
|
|
|
|
|
.btn-login-submit { |
|
|
width: 100%; |
|
|
padding: 1rem; |
|
|
border-radius: var(--radius-md); |
|
|
background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); |
|
|
color: white; |
|
|
border: none; |
|
|
font-weight: 700; |
|
|
font-size: 1rem; |
|
|
cursor: pointer; |
|
|
transition: all var(--transition); |
|
|
margin-top: 1rem; |
|
|
} |
|
|
|
|
|
.btn-login-submit:hover { |
|
|
transform: translateY(-2px); |
|
|
box-shadow: 0 6px 20px rgba(99,102,241,0.4); |
|
|
} |
|
|
|
|
|
.divider { |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 1rem; |
|
|
margin: 2rem 0; |
|
|
color: var(--text-muted); |
|
|
font-size: 0.9rem; |
|
|
} |
|
|
|
|
|
.divider::before, |
|
|
.divider::after { |
|
|
content: ''; |
|
|
flex: 1; |
|
|
height: 1px; |
|
|
background: var(--border); |
|
|
} |
|
|
|
|
|
.social-login { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(2, 1fr); |
|
|
gap: 0.75rem; |
|
|
} |
|
|
|
|
|
.btn-social { |
|
|
padding: 0.75rem; |
|
|
border-radius: var(--radius-sm); |
|
|
background: rgba(255,255,255,0.05); |
|
|
border: 1px solid var(--border); |
|
|
color: var(--text-primary); |
|
|
font-weight: 600; |
|
|
cursor: pointer; |
|
|
transition: all var(--transition); |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
gap: 0.5rem; |
|
|
} |
|
|
|
|
|
.btn-social:hover { |
|
|
background: rgba(255,255,255,0.1); |
|
|
border-color: var(--border-hover); |
|
|
} |
|
|
|
|
|
|
|
|
@media (max-width: 768px) { |
|
|
.nav-links { |
|
|
display: none; |
|
|
} |
|
|
|
|
|
.hero h2 { |
|
|
font-size: 2rem; |
|
|
} |
|
|
|
|
|
.giveaways-grid { |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
|
|
|
.filter-options { |
|
|
justify-content: center; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.hidden { |
|
|
display: none !important; |
|
|
} |
|
|
|
|
|
.loading { |
|
|
text-align: center; |
|
|
padding: 3rem; |
|
|
color: var(--text-secondary); |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
|
|
|
<nav class="navbar"> |
|
|
<div class="nav-container"> |
|
|
<a href="#" class="nav-logo"> |
|
|
<img src="https://linktree.retroplay.ro/images/logo-square.png" alt="RetroPlay"> |
|
|
<div class="nav-logo-text"> |
|
|
<h1>RetroPlay</h1> |
|
|
<p>Giveaways</p> |
|
|
</div> |
|
|
</a> |
|
|
<div class="nav-links"> |
|
|
<a href="#" class="nav-link active" data-page="home">🎮 Giveaways</a> |
|
|
<a href="#" class="nav-link" data-page="my-entries">📝 My Entries</a> |
|
|
<a href="#" class="nav-link" data-page="winners">🏆 Winners</a> |
|
|
<a href="#" class="nav-link" data-page="leaderboard">🏅 Leaderboard</a> |
|
|
</div> |
|
|
<div class="nav-actions"> |
|
|
<button class="btn-nav btn-secondary" id="btnUserMenu"> |
|
|
<span>👤</span> |
|
|
<span id="userName">Login</span> |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
</nav> |
|
|
|
|
|
|
|
|
<main class="container"> |
|
|
|
|
|
<section class="hero"> |
|
|
<div class="hero-content"> |
|
|
<h2>🎁 Premii Gratuite</h2> |
|
|
<p>Participă la giveaway-uri și câștigă jocuri pentru platformele tale favorite</p> |
|
|
|
|
|
<div class="stats"> |
|
|
<div class="stat-item"> |
|
|
<div class="stat-value" id="statActive">47</div> |
|
|
<div class="stat-label">Active Acum</div> |
|
|
</div> |
|
|
<div class="stat-item"> |
|
|
<div class="stat-value" id="statKeys">12,450</div> |
|
|
<div class="stat-label">Chei Disponibile</div> |
|
|
</div> |
|
|
<div class="stat-item"> |
|
|
<div class="stat-value" id="statUsers">8,923</div> |
|
|
<div class="stat-label">Participanți</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<section class="filters"> |
|
|
<div class="filter-group"> |
|
|
<label class="filter-label">🔍 Caută</label> |
|
|
<div class="search-box"> |
|
|
<span class="search-icon">🔍</span> |
|
|
<input type="text" class="search-input" id="searchInput" placeholder="Caută jocuri..."> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="filter-group"> |
|
|
<label class="filter-label">🎮 Platformă</label> |
|
|
<div class="filter-options" id="platformFilters"> |
|
|
<button class="filter-chip active" data-filter="all"> |
|
|
<span>✨</span> |
|
|
Toate |
|
|
</button> |
|
|
<button class="filter-chip" data-filter="steam"> |
|
|
<img src="https://store.steampowered.com/favicon.ico" alt="Steam" class="platform-icon"> |
|
|
Steam |
|
|
</button> |
|
|
<button class="filter-chip" data-filter="epic"> |
|
|
<span>🎯</span> |
|
|
Epic Games |
|
|
</button> |
|
|
<button class="filter-chip" data-filter="gog"> |
|
|
<span>🌟</span> |
|
|
GOG |
|
|
</button> |
|
|
<button class="filter-chip" data-filter="xbox"> |
|
|
<span>🎮</span> |
|
|
Xbox |
|
|
</button> |
|
|
<button class="filter-chip" data-filter="playstation"> |
|
|
<span>🎮</span> |
|
|
PlayStation |
|
|
</button> |
|
|
<button class="filter-chip" data-filter="nintendo"> |
|
|
<span>🎮</span> |
|
|
Nintendo |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="filter-group"> |
|
|
<label class="filter-label">🏷️ Categorie</label> |
|
|
<div class="filter-options" id="categoryFilters"> |
|
|
<button class="filter-chip active" data-category="all">Toate</button> |
|
|
<button class="filter-chip" data-category="raffle">🎲 Raffle</button> |
|
|
<button class="filter-chip" data-category="aaa">⭐ AAA</button> |
|
|
<button class="filter-chip" data-category="indie">🎨 Indie</button> |
|
|
<button class="filter-chip" data-category="new">✨ Noi</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="filter-group"> |
|
|
<label class="filter-label">⏱️ Sortare</label> |
|
|
<div class="filter-options" id="sortFilters"> |
|
|
<button class="filter-chip active" data-sort="newest">Cele mai noi</button> |
|
|
<button class="filter-chip" data-sort="ending">Se termină curând</button> |
|
|
<button class="filter-chip" data-sort="popular">Populare</button> |
|
|
<button class="filter-chip" data-sort="keys">Cele mai multe chei</button> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
<section class="giveaways-grid" id="giveawaysGrid"> |
|
|
|
|
|
</section> |
|
|
|
|
|
|
|
|
<div class="loading hidden" id="loadingState"> |
|
|
<p>Se încarcă giveaway-urile...</p> |
|
|
</div> |
|
|
</main> |
|
|
|
|
|
|
|
|
<div class="modal" id="winnersModal"> |
|
|
<div class="modal-content"> |
|
|
<div class="modal-header"> |
|
|
<h3>🏆 Winners Announcement</h3> |
|
|
<button class="modal-close" id="winnersModalClose">✕</button> |
|
|
</div> |
|
|
<div class="modal-body" id="winnersModalBody"> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="modal" id="giveawayModal"> |
|
|
<div class="modal-content"> |
|
|
<div class="modal-header"> |
|
|
<h3 id="modalTitle">Giveaway Details</h3> |
|
|
<button class="modal-close" id="modalClose">✕</button> |
|
|
</div> |
|
|
<div class="modal-body" id="modalBody"> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="modal" id="loginModal"> |
|
|
<div class="modal-content" style="max-width: 500px;"> |
|
|
<div class="modal-header"> |
|
|
<h3>Autentificare</h3> |
|
|
<button class="modal-close" id="loginModalClose">✕</button> |
|
|
</div> |
|
|
<div class="modal-body"> |
|
|
<div class="login-box" style="padding: 0; border: none; box-shadow: none;"> |
|
|
<div class="login-header"> |
|
|
<h2>Bun venit!</h2> |
|
|
<p>Conectează-te pentru a participa la giveaway-uri</p> |
|
|
</div> |
|
|
|
|
|
<form id="loginForm"> |
|
|
<div class="form-group"> |
|
|
<label class="form-label">Email</label> |
|
|
<input type="email" class="form-input" id="loginEmail" placeholder="email@exemplu.ro" required> |
|
|
</div> |
|
|
|
|
|
<div class="form-group"> |
|
|
<label class="form-label">Parolă</label> |
|
|
<input type="password" class="form-input" id="loginPassword" placeholder="••••••••" required> |
|
|
</div> |
|
|
|
|
|
<button type="submit" class="btn-login-submit">Intră în cont</button> |
|
|
</form> |
|
|
|
|
|
<div class="divider">sau continuă cu</div> |
|
|
|
|
|
<div class="social-login"> |
|
|
<button class="btn-social" data-provider="steam"> |
|
|
<img src="https://store.steampowered.com/favicon.ico" alt="" style="width:18px;height:18px;"> |
|
|
Steam |
|
|
</button> |
|
|
<button class="btn-social" data-provider="google"> |
|
|
<span>G</span> |
|
|
Google |
|
|
</button> |
|
|
<button class="btn-social" data-provider="discord"> |
|
|
<span>💬</span> |
|
|
Discord |
|
|
</button> |
|
|
<button class="btn-social" data-provider="facebook"> |
|
|
<span>f</span> |
|
|
Facebook |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<script> |
|
|
|
|
|
const giveawaysData = [ |
|
|
{ |
|
|
id: 1, |
|
|
title: "Cyberpunk 2077: Ultimate Edition", |
|
|
platform: "steam", |
|
|
image: "http://static.photos/technology/800x400/1", |
|
|
description: "Aventură open-world în Night City cu grafica îmbunătățită și toate DLC-urile incluse.", |
|
|
participants: 15420, |
|
|
keys: 500, |
|
|
timeLeft: 345600, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["RPG", "Action", "Open World"], |
|
|
isNew: true, |
|
|
requirements: [ |
|
|
"Follow pe Steam", |
|
|
"Join Discord", |
|
|
"Like pe Facebook", |
|
|
"Subscribe YouTube", |
|
|
"Follow pe Instagram", |
|
|
"Retweet pe Twitter", |
|
|
"Join Telegram", |
|
|
"Subscribe Newsletter" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 2, |
|
|
title: "Hollow Knight: Silksong", |
|
|
platform: "steam", |
|
|
image: "http://static.photos/gaming/800x400/2", |
|
|
description: "Secvența mult așteptată a jocului metroidvania aclamat critic.", |
|
|
participants: 8923, |
|
|
keys: 1000, |
|
|
timeLeft: 172800, |
|
|
tags: ["raffle", "indie"], |
|
|
genres: ["Metroidvania", "Platformer", "Action"], |
|
|
isNew: true, |
|
|
requirements: [ |
|
|
"Wishlist pe Steam", |
|
|
"Follow pe Twitter", |
|
|
"Join Discord", |
|
|
"Subscribe Twitch", |
|
|
"Follow pe TikTok", |
|
|
"Like pe Reddit", |
|
|
"Subscribe Newsletter" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 3, |
|
|
title: "Starfield: Digital Premium", |
|
|
platform: "xbox", |
|
|
image: "http://static.photos/space/800x400/3", |
|
|
description: "Explorează galaxia în noul RPG epic de la Bethesda Game Studios.", |
|
|
participants: 12156, |
|
|
keys: 300, |
|
|
timeLeft: 518400, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["RPG", "Space", "Adventure"], |
|
|
isNew: false, |
|
|
requirements: [ |
|
|
"Join Discord", |
|
|
"Subscribe YouTube", |
|
|
"Follow pe Instagram", |
|
|
"Like Facebook Page", |
|
|
"Follow pe Twitter", |
|
|
"Join Telegram", |
|
|
"Subscribe Newsletter", |
|
|
"Follow pe TikTok" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 4, |
|
|
title: "Hades II: Early Access", |
|
|
platform: "epic", |
|
|
image: "http://static.photos/gaming/800x400/4", |
|
|
description: "Roguelike sequel cu combat dinamic și poveste captivantă din mitologia greacă.", |
|
|
participants: 9234, |
|
|
keys: 750, |
|
|
timeLeft: 259200, |
|
|
tags: ["raffle", "indie"], |
|
|
genres: ["Roguelike", "Action", "Mythology"], |
|
|
isNew: true, |
|
|
requirements: [ |
|
|
"Follow pe Epic", |
|
|
"Join Discord", |
|
|
"Wishlist pe Epic", |
|
|
"Follow pe Twitter", |
|
|
"Subscribe YouTube", |
|
|
"Join Telegram", |
|
|
"Like pe Reddit" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 5, |
|
|
title: "The Witcher 3: Complete Edition", |
|
|
platform: "gog", |
|
|
image: "http://static.photos/fantasy/800x400/5", |
|
|
description: "RPG legendar cu toate expansiunile și upgrade-uri next-gen incluse.", |
|
|
participants: 18567, |
|
|
keys: 2000, |
|
|
timeLeft: 432000, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["RPG", "Fantasy", "Open World"], |
|
|
isNew: false, |
|
|
requirements: [ |
|
|
"Follow pe GOG", |
|
|
"Like pe Facebook", |
|
|
"Subscribe newsletter", |
|
|
"Join Discord", |
|
|
"Follow pe Twitter", |
|
|
"Subscribe YouTube", |
|
|
"Follow pe Instagram", |
|
|
"Join Telegram" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 6, |
|
|
title: "Ghost of Tsushima: Director's Cut", |
|
|
platform: "playstation", |
|
|
image: "http://static.photos/japan/800x400/6", |
|
|
description: "Aventură samurai breathtaking în Japonia feudală cu Iki Island expansion.", |
|
|
participants: 11234, |
|
|
keys: 400, |
|
|
timeLeft: 302400, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["Action", "Adventure", "Open World"], |
|
|
isNew: false, |
|
|
requirements: [ |
|
|
"Follow PlayStation", |
|
|
"Join Discord", |
|
|
"Share pe Twitter", |
|
|
"Subscribe YouTube", |
|
|
"Follow pe Instagram", |
|
|
"Like pe Facebook", |
|
|
"Join Telegram", |
|
|
"Subscribe Newsletter" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 7, |
|
|
title: "Celeste: Deluxe Edition", |
|
|
platform: "nintendo", |
|
|
image: "http://static.photos/retro/800x400/7", |
|
|
description: "Platformer challenging cu poveste emoționantă despre sănătate mentală.", |
|
|
participants: 6789, |
|
|
keys: 1500, |
|
|
timeLeft: 216000, |
|
|
tags: ["raffle", "indie"], |
|
|
genres: ["Platformer", "Pixel Art", "Story Rich"], |
|
|
isNew: false, |
|
|
requirements: [ |
|
|
"Follow Nintendo", |
|
|
"Join Discord", |
|
|
"Subscribe YouTube", |
|
|
"Follow pe Twitter", |
|
|
"Like pe Facebook", |
|
|
"Follow pe Instagram", |
|
|
"Join Telegram" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 8, |
|
|
title: "Baldur's Gate 3: Ultimate", |
|
|
platform: "steam", |
|
|
image: "http://static.photos/fantasy/800x400/8", |
|
|
description: "RPG bazat pe D&D 5e cu narrative complexe și combat strategic.", |
|
|
participants: 21456, |
|
|
keys: 250, |
|
|
timeLeft: 475200, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["RPG", "Strategy", "Fantasy"], |
|
|
isNew: true, |
|
|
requirements: [ |
|
|
"Wishlist Steam", |
|
|
"Follow Larian", |
|
|
"Join Discord", |
|
|
"Share Facebook", |
|
|
"Subscribe YouTube", |
|
|
"Follow pe Twitter", |
|
|
"Follow pe Instagram", |
|
|
"Join Telegram", |
|
|
"Subscribe Newsletter" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 9, |
|
|
title: "Stardew Valley: Expanded", |
|
|
platform: "gog", |
|
|
image: "http://static.photos/farming/800x400/9", |
|
|
description: "Farming simulator relaxant cu multiplayer și conținut nou exclusiv.", |
|
|
participants: 14123, |
|
|
keys: 3000, |
|
|
timeLeft: 388800, |
|
|
tags: ["raffle", "indie"], |
|
|
genres: ["Simulation", "Farming", "RPG"], |
|
|
isNew: false, |
|
|
requirements: [ |
|
|
"Follow pe GOG", |
|
|
"Subscribe YouTube", |
|
|
"Join Discord", |
|
|
"Follow pe Twitter", |
|
|
"Like pe Facebook", |
|
|
"Follow pe Instagram", |
|
|
"Join Telegram", |
|
|
"Subscribe Newsletter" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 10, |
|
|
title: "Elden Ring: Shadow of the Erdtree", |
|
|
platform: "steam", |
|
|
image: "http://static.photos/darkfantasy/800x400/10", |
|
|
description: "DLC masiv pentru soulslike epic cu noi zone și boss fights legendare.", |
|
|
participants: 19876, |
|
|
keys: 350, |
|
|
timeLeft: 561600, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["Souls-like", "Action RPG", "Dark Fantasy"], |
|
|
isNew: true, |
|
|
requirements: [ |
|
|
"Wishlist Steam", |
|
|
"Join Discord", |
|
|
"Follow Twitter", |
|
|
"Like Facebook", |
|
|
"Subscribe YouTube", |
|
|
"Follow Instagram", |
|
|
"Join Telegram", |
|
|
"Subscribe Newsletter" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 11, |
|
|
title: "Dead Cells: Return to Castlevania", |
|
|
platform: "epic", |
|
|
image: "http://static.photos/gaming/800x400/11", |
|
|
description: "Roguelike metroidvania cu combat fluid și crossover Castlevania.", |
|
|
participants: 7654, |
|
|
keys: 1200, |
|
|
timeLeft: 194400, |
|
|
tags: ["raffle", "indie"], |
|
|
genres: ["Roguelike", "Metroidvania", "Action"], |
|
|
isNew: false, |
|
|
requirements: [ |
|
|
"Follow Epic", |
|
|
"Join Discord", |
|
|
"Subscribe YouTube", |
|
|
"Follow Twitter", |
|
|
"Like Facebook", |
|
|
"Follow Instagram", |
|
|
"Join Telegram" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 12, |
|
|
title: "Forza Horizon 5: Premium", |
|
|
platform: "xbox", |
|
|
image: "http://static.photos/racing/800x400/12", |
|
|
description: "Racing open-world spectaculos în Mexic cu sute de mașini.", |
|
|
participants: 13245, |
|
|
keys: 600, |
|
|
timeLeft: 324000, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["Racing", "Open World", "Arcade"], |
|
|
isNew: false, |
|
|
requirements: [ |
|
|
"Follow Xbox", |
|
|
"Join Discord", |
|
|
"Subscribe Game Pass", |
|
|
"Subscribe YouTube", |
|
|
"Follow Twitter", |
|
|
"Like Facebook", |
|
|
"Follow Instagram" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 13, |
|
|
title: "God of War: Ragnarök", |
|
|
platform: "playstation", |
|
|
image: "http://static.photos/nordic/800x400/13", |
|
|
description: "Continuarea poveștii lui Kratos și Atreus în mitologia nordică.", |
|
|
participants: 18456, |
|
|
keys: 250, |
|
|
timeLeft: 432000, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["Action", "Adventure", "Story Rich"], |
|
|
isNew: true, |
|
|
requirements: [ |
|
|
"Follow PlayStation", |
|
|
"Join Discord", |
|
|
"Subscribe YouTube", |
|
|
"Follow Twitter", |
|
|
"Like Facebook", |
|
|
"Follow Instagram", |
|
|
"Join Telegram" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 14, |
|
|
title: "The Legend of Zelda: Tears of the Kingdom", |
|
|
platform: "nintendo", |
|
|
image: "http://static.photos/adventure/800x400/14", |
|
|
description: "Continuarea lui Breath of the Wild cu noi abilități și zone de explorat.", |
|
|
participants: 22567, |
|
|
keys: 200, |
|
|
timeLeft: 561600, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["Adventure", "Open World", "Action"], |
|
|
isNew: true, |
|
|
requirements: [ |
|
|
"Follow Nintendo", |
|
|
"Join Discord", |
|
|
"Subscribe YouTube", |
|
|
"Follow Twitter", |
|
|
"Like Facebook", |
|
|
"Follow Instagram" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 15, |
|
|
title: "Alan Wake 2", |
|
|
platform: "epic", |
|
|
image: "http://static.photos/horror/800x400/15", |
|
|
description: "Sequelul horror psihologic cu poveste non-lineară și atmosferă tensionată.", |
|
|
participants: 9876, |
|
|
keys: 500, |
|
|
timeLeft: 302400, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["Horror", "Psychological", "Story Rich"], |
|
|
isNew: true, |
|
|
requirements: [ |
|
|
"Follow Epic", |
|
|
"Join Discord", |
|
|
"Subscribe YouTube", |
|
|
"Follow Twitter", |
|
|
"Like Facebook", |
|
|
"Follow Instagram", |
|
|
"Join Telegram" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 16, |
|
|
title: "Street Fighter 6", |
|
|
platform: "steam", |
|
|
image: "http://static.photos/fighting/800x400/16", |
|
|
description: "Ultimul capitol din seria de fighting games cu noi personaje și mecanici.", |
|
|
participants: 14567, |
|
|
keys: 800, |
|
|
timeLeft: 259200, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["Fighting", "Action", "Competitive"], |
|
|
isNew: false, |
|
|
requirements: [ |
|
|
"Follow Steam", |
|
|
"Join Discord", |
|
|
"Subscribe YouTube", |
|
|
"Follow Twitter", |
|
|
"Like Facebook", |
|
|
"Follow Instagram" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 17, |
|
|
title: "Diablo IV", |
|
|
platform: "battlenet", |
|
|
image: "http://static.photos/darkfantasy/800x400/17", |
|
|
description: "Noul capitol din seria cult de ARPG cu lume open world și PvP.", |
|
|
participants: 32145, |
|
|
keys: 150, |
|
|
timeLeft: 475200, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["ARPG", "Dark Fantasy", "Open World"], |
|
|
isNew: true, |
|
|
requirements: [ |
|
|
"Follow Battle.net", |
|
|
"Join Discord", |
|
|
"Subscribe YouTube", |
|
|
"Follow Twitter", |
|
|
"Like Facebook", |
|
|
"Follow Instagram", |
|
|
"Join Telegram" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
id: 18, |
|
|
title: "Resident Evil 4 Remake", |
|
|
platform: "steam", |
|
|
image: "http://static.photos/horror/800x400/18", |
|
|
description: "Reimaginarea jocului clasic cu grafică next-gen și gameplay modernizat.", |
|
|
participants: 17890, |
|
|
keys: 600, |
|
|
timeLeft: 388800, |
|
|
tags: ["raffle", "aaa"], |
|
|
genres: ["Horror", "Action", "Survival"], |
|
|
isNew: false, |
|
|
requirements: [ |
|
|
"Follow Steam", |
|
|
"Join Discord", |
|
|
"Subscribe YouTube", |
|
|
"Follow Twitter", |
|
|
"Like Facebook", |
|
|
"Follow Instagram" |
|
|
] |
|
|
} |
|
|
]; |
|
|
|
|
|
|
|
|
let currentFilters = { |
|
|
platform: 'all', |
|
|
category: 'all', |
|
|
sort: 'newest', |
|
|
search: '' |
|
|
}; |
|
|
|
|
|
let currentUser = null; |
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', () => { |
|
|
initApp(); |
|
|
renderGiveaways(); |
|
|
startTimers(); |
|
|
setupEventListeners(); |
|
|
checkAuth(); |
|
|
}); |
|
|
function initApp() { |
|
|
|
|
|
const savedUser = localStorage.getItem('retroplay_user'); |
|
|
if (savedUser) { |
|
|
currentUser = JSON.parse(savedUser); |
|
|
updateUserUI(); |
|
|
} |
|
|
|
|
|
|
|
|
if (window.location.hash === '#winners') { |
|
|
showWinnersPage(); |
|
|
} |
|
|
} |
|
|
function checkAuth() { |
|
|
if (currentUser) { |
|
|
document.getElementById('userName').textContent = currentUser.name; |
|
|
} |
|
|
} |
|
|
|
|
|
function updateUserUI() { |
|
|
if (currentUser) { |
|
|
document.getElementById('userName').textContent = currentUser.name; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function renderGiveaways() { |
|
|
const grid = document.getElementById('giveawaysGrid'); |
|
|
const loading = document.getElementById('loadingState'); |
|
|
|
|
|
loading.classList.remove('hidden'); |
|
|
grid.innerHTML = ''; |
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
loading.classList.add('hidden'); |
|
|
|
|
|
let filtered = filterGiveaways(giveawaysData); |
|
|
|
|
|
if (filtered.length === 0) { |
|
|
grid.innerHTML = '<div class="loading">Nu s-au găsit giveaway-uri</div>'; |
|
|
return; |
|
|
} |
|
|
|
|
|
filtered.forEach(giveaway => { |
|
|
const card = createGiveawayCard(giveaway); |
|
|
grid.appendChild(card); |
|
|
}); |
|
|
}, 500); |
|
|
} |
|
|
|
|
|
function filterGiveaways(data) { |
|
|
let filtered = [...data]; |
|
|
|
|
|
|
|
|
if (currentFilters.platform !== 'all') { |
|
|
filtered = filtered.filter(g => g.platform === currentFilters.platform); |
|
|
} |
|
|
|
|
|
|
|
|
if (currentFilters.category !== 'all') { |
|
|
if (currentFilters.category === 'new') { |
|
|
filtered = filtered.filter(g => g.isNew); |
|
|
} else { |
|
|
filtered = filtered.filter(g => g.tags.includes(currentFilters.category)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (currentFilters.search) { |
|
|
const search = currentFilters.search.toLowerCase(); |
|
|
filtered = filtered.filter(g => |
|
|
g.title.toLowerCase().includes(search) || |
|
|
g.description.toLowerCase().includes(search) || |
|
|
g.genres.some(genre => genre.toLowerCase().includes(search)) |
|
|
); |
|
|
} |
|
|
|
|
|
|
|
|
switch (currentFilters.sort) { |
|
|
case 'newest': |
|
|
filtered.sort((a, b) => b.id - a.id); |
|
|
break; |
|
|
case 'ending': |
|
|
filtered.sort((a, b) => a.timeLeft - b.timeLeft); |
|
|
break; |
|
|
case 'popular': |
|
|
filtered.sort((a, b) => b.participants - a.participants); |
|
|
break; |
|
|
case 'keys': |
|
|
filtered.sort((a, b) => b.keys - a.keys); |
|
|
break; |
|
|
} |
|
|
|
|
|
return filtered; |
|
|
} |
|
|
|
|
|
function createGiveawayCard(giveaway) { |
|
|
const card = document.createElement('article'); |
|
|
card.className = 'giveaway-card'; |
|
|
card.dataset.id = giveaway.id; |
|
|
|
|
|
const platformIcons = { |
|
|
steam: 'https://store.steampowered.com/favicon.ico', |
|
|
epic: '🎯', |
|
|
gog: '🌟', |
|
|
xbox: '🎮', |
|
|
playstation: '🎮', |
|
|
nintendo: '🎮' |
|
|
}; |
|
|
|
|
|
const platformIcon = platformIcons[giveaway.platform] || '🎮'; |
|
|
const isPlatformImage = giveaway.platform === 'steam'; |
|
|
|
|
|
card.innerHTML = ` |
|
|
<div class="card-banner"> |
|
|
<img src="${giveaway.image}" alt="${giveaway.title}"> |
|
|
${giveaway.isNew ? '<div class="card-badge badge-new">✨ NOU</div>' : ''} |
|
|
<div class="card-platform"> |
|
|
${isPlatformImage ? `<img src="${platformIcon}" alt="${giveaway.platform}">` : `<span>${platformIcon}</span>`} |
|
|
</div> |
|
|
<div class="card-timer" data-time="${giveaway.timeLeft}"> |
|
|
<span>⏱️</span> |
|
|
<span class="timer-text">${formatTime(giveaway.timeLeft)}</span> |
|
|
</div> |
|
|
</div> |
|
|
<div class="card-body"> |
|
|
<h3 class="card-title">${giveaway.title}</h3> |
|
|
<p class="card-desc">${giveaway.description}</p> |
|
|
<div class="card-tags"> |
|
|
${giveaway.tags.map(tag => `<span class="tag tag-${tag}">${tag.toUpperCase()}</span>`).join('')} |
|
|
</div> |
|
|
<div class="card-stats"> |
|
|
<div class="card-stat"> |
|
|
<div class="card-stat-value">${formatNumber(giveaway.participants)}</div> |
|
|
<div class="card-stat-label">Participanți</div> |
|
|
</div> |
|
|
<div class="card-stat"> |
|
|
<div class="card-stat-value">${formatNumber(giveaway.keys)}</div> |
|
|
<div class="card-stat-label">Chei</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
`; |
|
|
|
|
|
card.addEventListener('click', () => openGiveawayModal(giveaway)); |
|
|
|
|
|
return card; |
|
|
} |
|
|
|
|
|
|
|
|
function openGiveawayModal(giveaway) { |
|
|
const modal = document.getElementById('giveawayModal'); |
|
|
const modalTitle = document.getElementById('modalTitle'); |
|
|
const modalBody = document.getElementById('modalBody'); |
|
|
|
|
|
modalTitle.textContent = giveaway.title; |
|
|
|
|
|
modalBody.innerHTML = ` |
|
|
<div style="margin-bottom: 1.5rem;"> |
|
|
<img src="${giveaway.image}" alt="${giveaway.title}" style="width:100%; border-radius:var(--radius-md); margin-bottom:1rem;"> |
|
|
<p style="color:var(--text-secondary); line-height:1.6; margin-bottom:1rem;">${giveaway.description}</p> |
|
|
|
|
|
<div style="display:flex; gap:0.5rem; flex-wrap:wrap; margin-bottom:1rem;"> |
|
|
${giveaway.genres.map(genre => `<span class="tag tag-indie">${genre}</span>`).join('')} |
|
|
</div> |
|
|
<div style="background:rgba(255,255,255,0.05); border-radius:var(--radius-md); padding:1.5rem; margin-bottom:1.5rem;"> |
|
|
<h4 style="margin-bottom:1rem; color:var(--accent-primary);">📋 Complete Tasks (+10 points each)</h4> |
|
|
<div style="display:grid; grid-template-columns:repeat(auto-fill, minmax(200px, 1fr)); gap:0.75rem;"> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="steam" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>✅ Follow Steam Page</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="youtube" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>🎥 Subscribe YouTube</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="facebook" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>👍 Like Facebook</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="instagram" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>📸 Follow Instagram</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="discord" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>💬 Join Discord</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="tiktok" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>🎵 Follow TikTok</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="telegram" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>📢 Join Telegram</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="reddit" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>🟥 Like pe Reddit</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="twitch" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>🎮 Subscribe Twitch</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="twitter" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>🐦 Follow Twitter</span> |
|
|
</label> |
|
|
<label style="display:flex; align-items:center; gap:0.75rem; cursor:pointer; padding:0.75rem; background:rgba(255,255,255,0.03); border-radius:var(--radius-sm); transition:all var(--transition);" onmouseover="this.style.background='rgba(255,255,255,0.1)', this.style.transform='translateY(-2px)', this.style.boxShadow='0 4px 12px rgba(0,0,0,0.2)'" onmouseout="this.style.background='rgba(255,255,255,0.03)', this.style.transform='none', this.style.boxShadow='none'"> |
|
|
<input type="checkbox" class="task-check" data-task="newsletter" style="width:18px; height:18px; cursor:pointer; accent-color:var(--accent-primary);"> |
|
|
<span>📩 Subscribe Newsletter</span> |
|
|
</label> |
|
|
</div> |
|
|
<div style="margin-top:1rem; padding:0.75rem; background:rgba(16,185,129,0.1); border-radius:var(--radius-sm); border-left:4px solid var(--accent-success); display:flex; align-items:center; gap:0.75rem;"> |
|
|
<span>✨</span> |
|
|
<small style="color:var(--text-secondary);">Each completed task gives you +10 points and increases your chances to win!</small> |
|
|
</div> |
|
|
</div> |
|
|
<button class="btn-primary" id="btnParticipate" style="width:100%; padding:1rem; font-size:1rem; border:none; cursor:pointer; transition:all 0.3s ease; position:relative; overflow:hidden;"> |
|
|
<span style="position:relative; z-index:2;">🎁 Participă acum</span> |
|
|
<span style="position:absolute; top:0; left:0; width:100%; height:100%; background:linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.2) 50%, rgba(255,255,255,0) 100%); transform:translateX(-100%); transition:transform 0.6s ease;"></span> |
|
|
</button> |
|
|
<script> |
|
|
document.getElementById('btnParticipate').addEventListener('mouseenter', function() { |
|
|
this.style.transform = 'translateY(-2px)'; |
|
|
this.style.boxShadow = '0 8px 24px rgba(99,102,241,0.5)'; |
|
|
this.querySelector('span:last-child').style.transform = 'translateX(100%)'; |
|
|
}); |
|
|
document.getElementById('btnParticipate').addEventListener('mouseleave', function() { |
|
|
this.style.transform = 'none'; |
|
|
this.style.boxShadow = 'none'; |
|
|
this.querySelector('span:last-child').style.transform = 'translateX(-100%)'; |
|
|
}); |
|
|
</script> |
|
|
</div> |
|
|
`; |
|
|
|
|
|
modal.classList.add('show'); |
|
|
|
|
|
// Check tasks |
|
|
const btnParticipate = document.getElementById('btnParticipate'); |
|
|
const checkboxes = modalBody.querySelectorAll('.task-check'); |
|
|
function updateButton() { |
|
|
const checkedCount = Array.from(checkboxes).filter(cb => cb.checked).length; |
|
|
const totalPoints = checkedCount * 10; |
|
|
|
|
|
btnParticipate.disabled = checkedCount === 0; |
|
|
btnParticipate.style.opacity = checkedCount > 0 ? '1' : '0.5'; |
|
|
btnParticipate.style.cursor = checkedCount > 0 ? 'pointer' : 'not-allowed'; |
|
|
|
|
|
// Update button text with points |
|
|
const btnText = checkedCount > 0 |
|
|
? `🎁 Participă acum (${totalPoints} Points)` |
|
|
: '🎁 Participă acum'; |
|
|
btnParticipate.querySelector('span:first-child').textContent = btnText; |
|
|
} |
|
|
checkboxes.forEach(cb => { |
|
|
cb.addEventListener('change', updateButton); |
|
|
}); |
|
|
|
|
|
updateButton(); |
|
|
|
|
|
btnParticipate.addEventListener('click', () => { |
|
|
if (!currentUser) { |
|
|
modal.classList.remove('show'); |
|
|
document.getElementById('loginModal').classList.add('show'); |
|
|
return; |
|
|
} |
|
|
|
|
|
const allChecked = Array.from(checkboxes).every(cb => cb.checked); |
|
|
if (allChecked) { |
|
|
alert(`✅ Felicitări! Ai fost înscris la giveaway-ul "${giveaway.title}"!\n\nÎți vom trimite notificare când sunt anunțați câștigătorii.`); |
|
|
modal.classList.remove('show'); |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
// ===== EVENT LISTENERS ===== |
|
|
function setupEventListeners() { |
|
|
// Modal close buttons |
|
|
document.getElementById('modalClose')?.addEventListener('click', () => { |
|
|
document.getElementById('giveawayModal').classList.remove('show'); |
|
|
}); |
|
|
|
|
|
document.getElementById('loginModalClose')?.addEventListener('click', () => { |
|
|
document.getElementById('loginModal').classList.remove('show'); |
|
|
}); |
|
|
|
|
|
// Close modal on backdrop click |
|
|
document.querySelectorAll('.modal').forEach(modal => { |
|
|
modal.addEventListener('click', (e) => { |
|
|
if (e.target === modal) { |
|
|
modal.classList.remove('show'); |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
// Platform filters |
|
|
document.querySelectorAll('#platformFilters .filter-chip').forEach(chip => { |
|
|
chip.addEventListener('click', () => { |
|
|
document.querySelectorAll('#platformFilters .filter-chip').forEach(c => c.classList.remove('active')); |
|
|
chip.classList.add('active'); |
|
|
currentFilters.platform = chip.dataset.filter; |
|
|
renderGiveaways(); |
|
|
}); |
|
|
}); |
|
|
|
|
|
// Category filters |
|
|
document.querySelectorAll('#categoryFilters .filter-chip').forEach(chip => { |
|
|
chip.addEventListener('click', () => { |
|
|
document.querySelectorAll('#categoryFilters .filter-chip').forEach(c => c.classList.remove('active')); |
|
|
chip.classList.add('active'); |
|
|
currentFilters.category = chip.dataset.category; |
|
|
renderGiveaways(); |
|
|
}); |
|
|
}); |
|
|
|
|
|
// Sort filters |
|
|
document.querySelectorAll('#sortFilters .filter-chip').forEach(chip => { |
|
|
chip.addEventListener('click', () => { |
|
|
document.querySelectorAll('#sortFilters .filter-chip').forEach(c => c.classList.remove('active')); |
|
|
chip.classList.add('active'); |
|
|
currentFilters.sort = chip.dataset.sort; |
|
|
renderGiveaways(); |
|
|
}); |
|
|
}); |
|
|
|
|
|
// Search |
|
|
const searchInput = document.getElementById('searchInput'); |
|
|
let searchTimeout; |
|
|
searchInput?.addEventListener('input', (e) => { |
|
|
clearTimeout(searchTimeout); |
|
|
searchTimeout = setTimeout(() => { |
|
|
currentFilters.search = e.target.value; |
|
|
renderGiveaways(); |
|
|
}, 300); |
|
|
}); |
|
|
|
|
|
// User menu |
|
|
document.getElementById('btnUserMenu')?.addEventListener('click', () => { |
|
|
if (currentUser) { |
|
|
if (confirm('Vrei să te deconectezi?')) { |
|
|
currentUser = null; |
|
|
localStorage.removeItem('retroplay_user'); |
|
|
document.getElementById('userName').textContent = 'Login'; |
|
|
} |
|
|
} else { |
|
|
document.getElementById('loginModal').classList.add('show'); |
|
|
} |
|
|
}); |
|
|
|
|
|
// Login form |
|
|
document.getElementById('loginForm')?.addEventListener('submit', (e) => { |
|
|
e.preventDefault(); |
|
|
const email = document.getElementById('loginEmail').value; |
|
|
|
|
|
currentUser = { |
|
|
name: email.split('@')[0], |
|
|
email: email |
|
|
}; |
|
|
|
|
|
localStorage.setItem('retroplay_user', JSON.stringify(currentUser)); |
|
|
updateUserUI(); |
|
|
document.getElementById('loginModal').classList.remove('show'); |
|
|
|
|
|
alert(`Bun venit, ${currentUser.name}! Acum poți participa la giveaway-uri! 🎉`); |
|
|
}); |
|
|
|
|
|
// Social login |
|
|
document.querySelectorAll('.btn-social').forEach(btn => { |
|
|
btn.addEventListener('click', () => { |
|
|
const provider = btn.dataset.provider; |
|
|
alert(`Demo: Autentificare cu ${provider}\n\nÎn producție, acesta ar redirecta către OAuth.`); |
|
|
}); |
|
|
}); |
|
|
} |
|
|
|
|
|
// ===== TIMER FUNCTIONS ===== |
|
|
function startTimers() { |
|
|
setInterval(() => { |
|
|
document.querySelectorAll('.card-timer').forEach(timer => { |
|
|
let timeLeft = parseInt(timer.dataset.time); |
|
|
if (timeLeft > 0) { |
|
|
timeLeft--; |
|
|
timer.dataset.time = timeLeft; |
|
|
const textEl = timer.querySelector('.timer-text'); |
|
|
if (textEl) { |
|
|
textEl.textContent = formatTime(timeLeft); |
|
|
} |
|
|
|
|
|
// Update color based on time |
|
|
const percentage = timeLeft / 604800; // 7 days |
|
|
if (percentage < 0.1) { |
|
|
timer.style.background = 'rgba(239, 68, 68, 0.9)'; |
|
|
} else if (percentage < 0.3) { |
|
|
timer.style.background = 'rgba(245, 158, 11, 0.9)'; |
|
|
} |
|
|
} |
|
|
}); |
|
|
}, 1000); |
|
|
} |
|
|
|
|
|
function formatTime(seconds) { |
|
|
const days = Math.floor(seconds / 86400); |
|
|
const hours = Math.floor((seconds % 86400) / 3600); |
|
|
const minutes = Math.floor((seconds % 3600) / 60); |
|
|
|
|
|
if (days > 0) return `${days}z ${hours}h`; |
|
|
if (hours > 0) return `${hours}h ${minutes}m`; |
|
|
return `${minutes}m`; |
|
|
} |
|
|
|
|
|
function formatNumber(num) { |
|
|
if (num >= 1000) { |
|
|
return (num / 1000).toFixed(1) + 'k'; |
|
|
} |
|
|
return num.toString(); |
|
|
} |
|
|
</script> |
|
|
</body> |
|
|
</html> |