erranova commited on
Commit
2d04abf
ยท
verified ยท
1 Parent(s): 1279c10

Update frontend/src/views/HomeView.vue

Browse files
Files changed (1) hide show
  1. frontend/src/views/HomeView.vue +254 -58
frontend/src/views/HomeView.vue CHANGED
@@ -1,12 +1,16 @@
1
  <template>
2
  <div class="home">
 
3
  <div class="bg-orbs">
4
  <div class="orb orb-1"></div>
5
  <div class="orb orb-2"></div>
6
  <div class="orb orb-3"></div>
7
  </div>
 
 
8
  <div class="noise"></div>
9
 
 
10
  <nav class="nav" :class="{ scrolled: isScrolled }">
11
  <div class="nav-inner">
12
  <div class="logo" @click="$router.push('/')">
@@ -17,64 +21,130 @@
17
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
18
  <circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/>
19
  </svg>
20
- <span class="lang-text">{{ locale === 'fr' ? 'ุงู„ุนุฑุจูŠุฉ' : 'Franรงais' }}</span>
21
  </button>
22
- <button class="btn-primary" @click="$router.push('/login')">
23
  <span>{{ t('nav.login') }}</span>
 
 
 
24
  </button>
25
  </div>
26
  </div>
27
  </nav>
28
 
 
29
  <section class="hero">
30
  <div class="hero-content">
31
- <h1>
 
 
32
  {{ t('hero.title1') }}<br>
33
  <em class="gold-text">{{ t('hero.title2') }}</em><br>
34
  {{ t('hero.title3') }}
35
  </h1>
36
- <p class="hero-sub">{{ t('hero.subtitle') }}</p>
37
 
38
- <!-- --- CORRECTION ICI : hero-actions avec plus d'espace --- -->
39
- <div class="hero-actions">
40
- <button class="btn-hero-main" @click="$router.push('/login')">
 
 
 
41
  <span>{{ t('hero.action') }}</span>
42
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
43
  <path d="M5 12h14M12 5l7 7-7 7"/>
44
  </svg>
45
  </button>
46
- <a class="btn-whatsapp" :href="whatsappUrl" target="_blank">
47
  <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
48
- <path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606..."/>
49
  </svg>
50
  {{ t('hero.contact') }}
51
  </a>
52
  </div>
53
  </div>
54
-
55
- <div class="floating-cards">
56
- <div class="float-card fc-1">๐Ÿ“ Mathรฉmatiques</div>
57
- <div class="float-card fc-2">โš—๏ธ Physique-Chimie</div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  </div>
59
  </section>
60
 
61
- <!-- Steps -->
62
  <section class="how-it-works">
63
  <h2 class="section-title">{{ t('howItWorks.title') }}</h2>
64
  <div class="timeline">
65
  <div class="step-card" v-for="(step, i) in steps" :key="i">
66
  <div class="step-number">{{ i + 1 }}</div>
67
  <div class="step-content">
68
- <h3 class="step-title">{{ step.title }}</h3>
69
- <p class="step-desc">{{ step.desc }}</p>
70
  </div>
71
  </div>
72
  </div>
73
  </section>
74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  <footer class="footer">
76
  <div class="footer-inner">
77
- <img src="/logo.png" alt="ErraNova" class="footer-logo-img">
 
 
78
  <p class="footer-copy">{{ t('footer.copy') }}</p>
79
  </div>
80
  </footer>
@@ -84,70 +154,196 @@
84
  <script setup>
85
  import { ref, computed, onMounted } from 'vue'
86
  import { useI18n } from 'vue-i18n'
 
87
  const { t, locale } = useI18n()
 
88
  const isScrolled = ref(false)
89
- const locale_val = computed(() => locale.value)
90
- const toggleLang = () => { locale.value = locale.value === 'fr' ? 'ar' : 'fr' }
91
- const whatsappUrl = computed(() => `https://wa.me/212600000000?text=Bonjour`)
 
 
 
 
 
 
 
 
92
  const steps = computed(() => [
93
  { title: t('howItWorks.step1.title'), desc: t('howItWorks.step1.desc') },
94
  { title: t('howItWorks.step2.title'), desc: t('howItWorks.step2.desc') },
95
  { title: t('howItWorks.step3.title'), desc: t('howItWorks.step3.desc') }
96
  ])
97
- onMounted(() => {
 
 
 
 
 
 
 
98
  window.addEventListener('scroll', () => { isScrolled.value = window.scrollY > 40 })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  })
100
  </script>
101
 
102
  <style scoped>
103
- .home { min-height: 100vh; background: #0d1117; color: #fff; overflow-x: hidden; }
104
- .bg-orbs { position: fixed; inset: 0; z-index: 0; }
105
- .orb { position: absolute; border-radius: 50%; filter: blur(80px); opacity: 0.3; }
106
- .orb-1 { width: 500px; height: 500px; background: #c9a84c22; top: -100px; right: -100px; }
 
 
 
 
 
 
 
 
 
107
 
108
  /* Nav */
109
- .nav { position: fixed; top: 0; left: 0; right: 0; z-index: 100; padding: 20px 0; transition: 0.3s; }
110
- .nav.scrolled { background: rgba(13,17,23,0.9); backdrop-filter: blur(10px); padding: 12px 0; }
111
- .nav-inner { max-width: 1200px; margin: 0 auto; padding: 0 40px; display: flex; justify-content: space-between; align-items: center; }
112
- .logo-img { height: 140px; }
113
- .nav.scrolled .logo-img { height: 90px; }
114
- .nav-actions { display: flex; gap: 16px; align-items: center; }
115
- .lang-btn { background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); color: #fff; padding: 8px 16px; border-radius: 8px; cursor: pointer; }
116
- .btn-primary { border: 1px solid #c9a84c; color: #c9a84c; background: transparent; padding: 8px 20px; border-radius: 8px; cursor: pointer; }
 
 
 
 
 
 
 
117
 
118
  /* Hero */
119
- .hero { min-height: 100vh; display: flex; align-items: center; max-width: 1200px; margin: 0 auto; padding: 120px 40px; gap: 40px; }
120
- h1 { font-family: 'Playfair Display', serif; font-size: 3.5rem; line-height: 1.2; margin-bottom: 20px; color: #fff !important; }
121
- .gold-text { color: #c9a84c; }
122
- .hero-sub { color: rgba(255,255,255,0.7) !important; font-size: 1.1rem; margin-bottom: 40px; max-width: 600px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
- /* Correction GAP entre les boutons */
125
- .hero-actions { display: flex; gap: 24px; flex-wrap: wrap; align-items: center; }
126
 
127
- .btn-hero-main { padding: 14px 28px; background: #c9a84c; color: #0d1117; border-radius: 10px; font-weight: 700; border: none; cursor: pointer; display: flex; align-items: center; gap: 8px; }
128
- .btn-whatsapp { padding: 14px 28px; border: 1px solid rgba(255,255,255,0.2); border-radius: 10px; color: #fff; text-decoration: none; display: flex; align-items: center; gap: 8px; }
 
 
 
 
 
 
 
 
 
 
 
129
 
130
- /* Steps */
131
- .timeline { display: flex; flex-direction: column; gap: 30px; margin-top: 50px; }
132
- .step-card { display: flex; gap: 20px; background: rgba(255,255,255,0.03); padding: 30px; border-radius: 15px; border: 1px solid rgba(255,255,255,0.05); margin-left: 60px; position: relative; }
133
- .step-number { position: absolute; left: -60px; width: 45px; height: 45px; border: 2px solid #c9a84c; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: #c9a84c; font-weight: 700; }
134
- .step-title { color: #fff !important; margin-bottom: 10px; font-size: 1.3rem; }
135
- .step-desc { color: rgba(255,255,255,0.7) !important; line-height: 1.5; }
136
- .section-title { text-align: center; font-size: 2.5rem; color: #fff !important; }
 
137
 
138
  /* Footer */
139
- .footer { padding: 50px 40px; border-top: 1px solid rgba(255,255,255,0.05); }
140
- .footer-inner { max-width: 1200px; margin: 0 auto; display: flex; justify-content: space-between; align-items: center; }
141
- .footer-logo-img { height: 80px; opacity: 0.5; }
 
142
 
143
- /* Mobile */
144
  @media (max-width: 768px) {
145
- .hero { flex-direction: column; text-align: center; padding: 140px 20px 80px; }
146
- .hero-actions { justify-content: center; gap: 16px; }
147
- .logo-img { height: 100px; }
 
 
 
 
 
 
 
 
 
 
 
148
  .nav-inner { padding: 0 20px; }
149
- .lang-text { display: none; }
150
- .step-card { margin-left: 50px; }
151
- .step-number { left: -50px; width: 35px; height: 35px; }
152
  }
153
  </style>
 
1
  <template>
2
  <div class="home">
3
+ <!-- Animated background -->
4
  <div class="bg-orbs">
5
  <div class="orb orb-1"></div>
6
  <div class="orb orb-2"></div>
7
  <div class="orb orb-3"></div>
8
  </div>
9
+
10
+ <!-- Noise texture overlay -->
11
  <div class="noise"></div>
12
 
13
+ <!-- Nav -->
14
  <nav class="nav" :class="{ scrolled: isScrolled }">
15
  <div class="nav-inner">
16
  <div class="logo" @click="$router.push('/')">
 
21
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
22
  <circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/>
23
  </svg>
24
+ <span>{{ locale === 'fr' ? 'ุงู„ุนุฑุจูŠุฉ' : 'Franรงais' }}</span>
25
  </button>
26
+ <button class="btn-primary" id="btn-login-nav" @click="$router.push('/login')">
27
  <span>{{ t('nav.login') }}</span>
28
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
29
+ <path d="M5 12h14M12 5l7 7-7 7"/>
30
+ </svg>
31
  </button>
32
  </div>
33
  </div>
34
  </nav>
35
 
36
+ <!-- Hero -->
37
  <section class="hero">
38
  <div class="hero-content">
39
+
40
+
41
+ <h1 ref="titleEl">
42
  {{ t('hero.title1') }}<br>
43
  <em class="gold-text">{{ t('hero.title2') }}</em><br>
44
  {{ t('hero.title3') }}
45
  </h1>
 
46
 
47
+ <p class="hero-sub" ref="subEl">
48
+ {{ t('hero.subtitle') }}
49
+ </p>
50
+
51
+ <div class="hero-actions" ref="actionsEl">
52
+ <button class="btn-hero-main" id="btn-access" @click="$router.push('/login')">
53
  <span>{{ t('hero.action') }}</span>
54
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
55
  <path d="M5 12h14M12 5l7 7-7 7"/>
56
  </svg>
57
  </button>
58
+ <a class="btn-whatsapp" :href="whatsappUrl" target="_blank" rel="noopener">
59
  <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
60
+ <path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347z"/>
61
  </svg>
62
  {{ t('hero.contact') }}
63
  </a>
64
  </div>
65
  </div>
66
+
67
+ <!-- Decorative cards floating -->
68
+ <div class="floating-cards" ref="cardsEl">
69
+ <div class="float-card fc-1">
70
+ <div class="fc-icon">๐Ÿ“</div>
71
+ <div>
72
+ <div class="fc-title">Mathรฉmatiques</div>
73
+ <div class="fc-sub">48 cours disponibles</div>
74
+ </div>
75
+ </div>
76
+ <div class="float-card fc-2">
77
+ <div class="fc-icon">โš—๏ธ</div>
78
+ <div>
79
+ <div class="fc-title">Physique-Chimie</div>
80
+ <div class="fc-sub">36 exercices</div>
81
+ </div>
82
+ </div>
83
+ <div class="float-card fc-3">
84
+ <div class="fc-icon">๐Ÿ“œ</div>
85
+ <div>
86
+ <div class="fc-title">Philosophie</div>
87
+ <div class="fc-sub">24 examens</div>
88
+ </div>
89
+ </div>
90
+ <div class="float-card fc-4">
91
+ <div class="fc-icon">๐ŸŒ</div>
92
+ <div>
93
+ <div class="fc-title">Histoire-Gรฉo</div>
94
+ <div class="fc-sub">Sciences &amp; Lettres</div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </section>
99
+
100
+ <!-- Animated Announcement Section -->
101
+ <section v-if="announcement.active" class="announcement-section">
102
+ <div class="announcement-card glowing-border">
103
+ <div class="announcement-icon-wrap">
104
+ <span class="pulse-ring"></span>
105
+ <svg class="announcement-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
106
+ <path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path><path d="M13.73 21a2 2 0 0 1-3.46 0"></path>
107
+ </svg>
108
+ </div>
109
+ <div class="announcement-content">
110
+ <h4>{{ t('announcementTitle') }}</h4>
111
+ <p>{{ announcement.text }}</p>
112
+ </div>
113
  </div>
114
  </section>
115
 
116
+ <!-- How it works (Student Path) -->
117
  <section class="how-it-works">
118
  <h2 class="section-title">{{ t('howItWorks.title') }}</h2>
119
  <div class="timeline">
120
  <div class="step-card" v-for="(step, i) in steps" :key="i">
121
  <div class="step-number">{{ i + 1 }}</div>
122
  <div class="step-content">
123
+ <h3>{{ step.title }}</h3>
124
+ <p>{{ step.desc }}</p>
125
  </div>
126
  </div>
127
  </div>
128
  </section>
129
 
130
+ <!-- Platform Content -->
131
+ <section class="platform-content">
132
+ <h2 class="section-title">{{ t('platformContent.title') }}</h2>
133
+ <div class="content-grid">
134
+ <div class="content-card" v-for="(c, i) in contents" :key="i">
135
+ <div class="content-icon">{{ c.icon }}</div>
136
+ <h3>{{ c.title }}</h3>
137
+ <p>{{ c.desc }}</p>
138
+ </div>
139
+ </div>
140
+ </section>
141
+
142
+ <!-- Footer -->
143
  <footer class="footer">
144
  <div class="footer-inner">
145
+ <div class="footer-logo">
146
+ <img src="/logo.png" alt="ErraNova" class="footer-logo-img">
147
+ </div>
148
  <p class="footer-copy">{{ t('footer.copy') }}</p>
149
  </div>
150
  </footer>
 
154
  <script setup>
155
  import { ref, computed, onMounted } from 'vue'
156
  import { useI18n } from 'vue-i18n'
157
+
158
  const { t, locale } = useI18n()
159
+
160
  const isScrolled = ref(false)
161
+ const whatsappNumber = ref('+212600000000')
162
+ const announcement = ref({ active: false, text: '' })
163
+
164
+ function toggleLang() {
165
+ locale.value = locale.value === 'fr' ? 'ar' : 'fr'
166
+ }
167
+
168
+ const whatsappUrl = computed(() =>
169
+ `https://wa.me/${whatsappNumber.value.replace(/\D/g, '')}?text=${locale.value === 'fr' ? 'Bonjour, je souhaite crรฉer un compte.' : 'ู…ุฑุญุจุงุŒ ุฃุฑูŠุฏ ุฅู†ุดุงุก ุญุณุงุจ.'}`
170
+ )
171
+
172
  const steps = computed(() => [
173
  { title: t('howItWorks.step1.title'), desc: t('howItWorks.step1.desc') },
174
  { title: t('howItWorks.step2.title'), desc: t('howItWorks.step2.desc') },
175
  { title: t('howItWorks.step3.title'), desc: t('howItWorks.step3.desc') }
176
  ])
177
+
178
+ const contents = computed(() => [
179
+ { icon: '๐Ÿ“š', title: t('platformContent.courses.title'), desc: t('platformContent.courses.desc') },
180
+ { icon: '๐Ÿ“', title: t('platformContent.exercises.title'), desc: t('platformContent.exercises.desc') },
181
+ { icon: '๐ŸŽ“', title: t('platformContent.exams.title'), desc: t('platformContent.exams.desc') }
182
+ ])
183
+
184
+ onMounted(async () => {
185
  window.addEventListener('scroll', () => { isScrolled.value = window.scrollY > 40 })
186
+
187
+ // Fetch WhatsApp number
188
+ try {
189
+ const r = await fetch('/api/auth/whatsapp/')
190
+ const d = await r.json()
191
+ if (d.whatsapp) whatsappNumber.value = d.whatsapp
192
+ } catch {}
193
+
194
+ // Fetch announcement (public)
195
+ try {
196
+ const r = await fetch('/api/auth/announcement/')
197
+ const d = await r.json()
198
+ announcement.value = d
199
+ } catch {}
200
+
201
+ // Entrance animations
202
+ const els = document.querySelectorAll('.badge-pill, h1, .hero-sub, .hero-actions, .float-card, .step-card, .content-card')
203
+ els.forEach((el, i) => {
204
+ el.style.opacity = '0'
205
+ el.style.transform = 'translateY(24px)'
206
+ setTimeout(() => {
207
+ el.style.transition = 'opacity 0.7s ease, transform 0.7s ease'
208
+ el.style.opacity = '1'
209
+ el.style.transform = 'translateY(0)'
210
+ }, 100 + i * 80)
211
+ })
212
  })
213
  </script>
214
 
215
  <style scoped>
216
+ .home { min-height: 100vh; position: relative; overflow-x: hidden; background: #0d1117; }
217
+
218
+ /* BG Orbs */
219
+ .bg-orbs { position: fixed; inset: 0; pointer-events: none; z-index: 0; }
220
+ .orb { position: absolute; border-radius: 50%; filter: blur(80px); opacity: 0.4; }
221
+ .orb-1 { width: 600px; height: 600px; background: radial-gradient(circle, #c9a84c22, transparent); top: -200px; right: -200px; animation: drift 12s ease-in-out infinite; }
222
+ .orb-2 { width: 400px; height: 400px; background: radial-gradient(circle, #1e253022, transparent); bottom: 100px; left: -100px; animation: drift 16s ease-in-out infinite reverse; }
223
+ .orb-3 { width: 300px; height: 300px; background: radial-gradient(circle, #c9a84c18, transparent); top: 50%; left: 40%; animation: drift 10s ease-in-out infinite 2s; }
224
+ @keyframes drift { 0%, 100% { transform: translate(0,0); } 50% { transform: translate(30px, -30px); } }
225
+
226
+ .noise { position: fixed; inset: 0; pointer-events: none; z-index: 0; opacity: 0.03;
227
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
228
+ }
229
 
230
  /* Nav */
231
+ .nav { position: fixed; top: 0; left: 0; right: 0; z-index: 100; padding: 20px 0; transition: all 0.4s ease; }
232
+ .nav.scrolled { background: rgba(13,17,23,0.85); backdrop-filter: blur(20px); padding: 14px 0; border-bottom: 1px solid rgba(201,168,76,0.15); }
233
+ .nav-inner { max-width: 1200px; margin: 0 auto; padding: 0 40px; display: flex; align-items: center; justify-content: space-between; }
234
+
235
+ .logo { display: flex; align-items: center; cursor: pointer; }
236
+ .logo-img { height: 144px; width: auto; transition: height 0.3s ease; }
237
+ .nav.scrolled .logo-img { height: 100px; }
238
+ .nav-actions { display: flex; align-items: center; gap: 16px; }
239
+ .lang-btn { background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.15); color: #fff; padding: 8px 16px; border-radius: 10px; font-size: 0.85rem; display: flex; align-items: center; gap: 8px; transition: all 0.3s ease; font-family: 'DM Sans', sans-serif; }
240
+ .lang-btn:hover { border-color: var(--gold); color: var(--gold); background: rgba(201,168,76,0.08); }
241
+
242
+ /* Nav button */
243
+ .nav .btn-primary { background: transparent; border: 1.5px solid rgba(201,168,76,0.5); color: var(--gold); }
244
+ .nav .btn-primary::after { background: var(--gold); }
245
+ .nav .btn-primary:hover span { color: var(--ink); }
246
 
247
  /* Hero */
248
+ .hero { min-height: 100vh; display: flex; align-items: center; justify-content: space-between; max-width: 1200px; margin: 0 auto; padding: 120px 40px 80px; position: relative; z-index: 1; gap: 60px; }
249
+
250
+ .hero-content { flex: 1; }
251
+
252
+ .badge-pill { display: inline-flex; align-items: center; gap: 8px; padding: 8px 16px; background: rgba(201,168,76,0.1); border: 1px solid rgba(201,168,76,0.3); border-radius: 30px; font-size: 0.82rem; color: var(--gold); letter-spacing: 0.02em; margin-bottom: 28px; }
253
+ .dot { width: 6px; height: 6px; background: var(--gold); border-radius: 50%; animation: pulse-dot 2s ease infinite; }
254
+ @keyframes pulse-dot { 0%,100%{opacity:1;} 50%{opacity:0.3;} }
255
+
256
+ h1 { font-family: 'Playfair Display', serif; font-size: clamp(2.4rem, 5vw, 4rem); line-height: 1.15; color: #fff; margin-bottom: 24px; }
257
+ .gold-text { color: var(--gold); font-style: italic; }
258
+
259
+ .hero-sub { font-size: 1.05rem; color: rgba(255,255,255,0.55); line-height: 1.7; margin-bottom: 40px; max-width: 500px; }
260
+
261
+ .hero-actions { display: flex; gap: 16px; flex-wrap: wrap; }
262
+
263
+ .btn-hero-main { display: inline-flex; align-items: center; gap: 10px; padding: 14px 32px; background: var(--gold); color: var(--ink); border-radius: 12px; font-weight: 700; font-size: 1rem; font-family: 'DM Sans', sans-serif; transition: all 0.3s ease; cursor: pointer; border: none; }
264
+ .btn-hero-main:hover { background: var(--gold-light); transform: translateY(-3px); box-shadow: 0 12px 32px rgba(201,168,76,0.4); }
265
+
266
+ .btn-whatsapp { display: inline-flex; align-items: center; gap: 10px; padding: 14px 28px; border: 1.5px solid rgba(255,255,255,0.15); border-radius: 12px; color: rgba(255,255,255,0.75); font-size: 0.95rem; font-family: 'DM Sans', sans-serif; transition: all 0.3s ease; }
267
+ .btn-whatsapp:hover { border-color: #25d366; color: #25d366; background: rgba(37,211,102,0.08); }
268
+
269
+ /* Floating cards */
270
+ .floating-cards { flex: 1; max-width: 380px; position: relative; height: 460px; }
271
+ .float-card { position: absolute; background: rgba(255,255,255,0.05); backdrop-filter: blur(20px); border: 1px solid rgba(201,168,76,0.2); border-radius: 16px; padding: 16px 20px; display: flex; align-items: center; gap: 14px; min-width: 200px; transition: all 0.3s ease; }
272
+ .float-card:hover { transform: translateY(-4px) !important; border-color: rgba(201,168,76,0.5); }
273
+ .fc-icon { font-size: 1.8rem; }
274
+ .fc-title { color: #fff; font-weight: 600; font-size: 0.9rem; }
275
+ .fc-sub { color: rgba(255,255,255,0.45); font-size: 0.8rem; margin-top: 2px; }
276
+ .fc-1 { top: 0; left: 0; animation: float1 6s ease-in-out infinite; }
277
+ .fc-2 { top: 100px; right: 0; animation: float2 7s ease-in-out infinite 1s; }
278
+ .fc-3 { top: 220px; left: 30px; animation: float1 8s ease-in-out infinite 0.5s; }
279
+ .fc-4 { bottom: 20px; right: 20px; animation: float2 6.5s ease-in-out infinite 1.5s; }
280
+ @keyframes float1 { 0%,100%{transform:translateY(0);} 50%{transform:translateY(-12px);} }
281
+ @keyframes float2 { 0%,100%{transform:translateY(0);} 50%{transform:translateY(10px);} }
282
+
283
+ /* Section Title */
284
+ .section-title { font-family: 'Playfair Display', serif; font-size: 2.2rem; color: #fff; text-align: center; margin-bottom: 40px; }
285
+
286
+ /* Announcement Section */
287
+ .announcement-section { max-width: 1000px; margin: 0 auto 60px; padding: 0 40px; position: relative; z-index: 2; }
288
+ .announcement-card { background: rgba(201,168,76,0.08); border: 1px solid rgba(201,168,76,0.3); border-radius: 16px; padding: 24px; display: flex; align-items: center; gap: 24px; box-shadow: 0 8px 32px rgba(201,168,76,0.15); backdrop-filter: blur(10px); animation: slideUpFade 0.6s ease-out; }
289
+ .glowing-border { position: relative; }
290
+ .glowing-border::before { content: ''; position: absolute; inset: -1px; border-radius: 16px; padding: 1px; background: linear-gradient(45deg, transparent, var(--gold), transparent); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; opacity: 0.5; animation: shine 3s linear infinite; }
291
+ .announcement-icon-wrap { position: relative; width: 48px; height: 48px; display: flex; align-items: center; justify-content: center; background: rgba(201,168,76,0.2); border-radius: 50%; color: var(--gold); }
292
+ .pulse-ring { position: absolute; inset: -8px; border: 2px solid var(--gold); border-radius: 50%; animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; opacity: 0; }
293
+ .announcement-content { flex: 1; }
294
+ .announcement-content h4 { color: var(--gold); font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 6px; }
295
+ .announcement-content p { color: #fff; font-size: 1.1rem; line-height: 1.5; font-weight: 500; }
296
+ @keyframes pulse { 0% { transform: scale(0.8); opacity: 0.5; } 100% { transform: scale(1.3); opacity: 0; } }
297
+ @keyframes shine { 100% { transform: rotate(360deg); } }
298
+ @keyframes slideUpFade { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }
299
 
300
+ [dir="rtl"] .announcement-card { animation: slideUpFade 0.6s ease-out; }
 
301
 
302
+ /* How It Works (Steps) */
303
+ .how-it-works { padding: 60px 40px; max-width: 1200px; margin: 0 auto; position: relative; z-index: 1; }
304
+ .timeline { display: flex; flex-direction: column; gap: 24px; position: relative; }
305
+ .timeline::before { content: ''; position: absolute; left: 24px; top: 0; bottom: 0; width: 2px; background: rgba(201,168,76,0.2); }
306
+ [dir="rtl"] .timeline::before { left: auto; right: 24px; }
307
+ .step-card { display: flex; gap: 24px; background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.08); border-radius: 16px; padding: 24px; margin-left: 56px; position: relative; transition: all 0.3s ease; }
308
+ [dir="rtl"] .step-card { margin-left: 0; margin-right: 56px; }
309
+ .step-card:hover { transform: translateX(8px); background: rgba(255,255,255,0.06); border-color: rgba(201,168,76,0.3); }
310
+ [dir="rtl"] .step-card:hover { transform: translateX(-8px); }
311
+ .step-number { position: absolute; left: -56px; width: 48px; height: 48px; background: #0d1117; border: 2px solid var(--gold); color: var(--gold); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-family: 'Playfair Display', serif; font-size: 1.5rem; font-weight: 700; z-index: 2; box-shadow: 0 0 16px rgba(201,168,76,0.2); }
312
+ [dir="rtl"] .step-number { left: auto; right: -56px; }
313
+ .step-content h3 { color: #fff; font-size: 1.2rem; margin-bottom: 8px; }
314
+ .step-content p { color: rgba(255,255,255,0.6); line-height: 1.6; }
315
 
316
+ /* Platform Content */
317
+ .platform-content { padding: 60px 40px 100px; max-width: 1200px; margin: 0 auto; position: relative; z-index: 1; }
318
+ .content-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 32px; }
319
+ .content-card { background: linear-gradient(145deg, rgba(255,255,255,0.05), rgba(255,255,255,0.01)); border: 1px solid rgba(255,255,255,0.08); border-radius: 20px; padding: 32px; text-align: center; transition: all 0.4s ease; }
320
+ .content-card:hover { transform: translateY(-8px); border-color: rgba(201,168,76,0.4); box-shadow: 0 12px 40px rgba(0,0,0,0.3); background: linear-gradient(145deg, rgba(201,168,76,0.1), rgba(255,255,255,0.02)); }
321
+ .content-icon { font-size: 3rem; margin-bottom: 20px; filter: drop-shadow(0 4px 8px rgba(0,0,0,0.2)); }
322
+ .content-card h3 { color: #fff; font-size: 1.3rem; margin-bottom: 12px; }
323
+ .content-card p { color: rgba(255,255,255,0.55); line-height: 1.6; }
324
 
325
  /* Footer */
326
+ .footer { border-top: 1px solid rgba(201,168,76,0.1); padding: 32px 40px; position: relative; z-index: 1; }
327
+ .footer-inner { max-width: 1200px; margin: 0 auto; display: flex; align-items: center; justify-content: space-between; }
328
+ .footer-logo-img { height: 96px; width: auto; opacity: 0.6; }
329
+ .footer-copy { color: rgba(255,255,255,0.3); font-size: 0.85rem; }
330
 
 
331
  @media (max-width: 768px) {
332
+ .hero { flex-direction: column; padding: 120px 24px 60px; text-align: center; }
333
+ .floating-cards { display: none; }
334
+ .hero-actions { justify-content: center; }
335
+ .hero-sub { margin-left: auto; margin-right: auto; }
336
+ .announcement-section { padding: 0 24px; }
337
+ .announcement-card { flex-direction: column; text-align: center; padding: 20px; gap: 16px; }
338
+ .how-it-works, .platform-content { padding: 60px 24px; }
339
+ .timeline::before { left: 20px; }
340
+ [dir="rtl"] .timeline::before { left: auto; right: 20px; }
341
+ .step-card { margin-left: 48px; padding: 20px; }
342
+ [dir="rtl"] .step-card { margin-left: 0; margin-right: 48px; }
343
+ .step-number { left: -48px; width: 40px; height: 40px; font-size: 1.2rem; }
344
+ [dir="rtl"] .step-number { left: auto; right: -48px; }
345
+ .footer-inner { flex-direction: column; gap: 12px; text-align: center; }
346
  .nav-inner { padding: 0 20px; }
347
+ .lang-btn span { display: none; }
 
 
348
  }
349
  </style>