Alsmwal commited on
Commit
66aef7e
·
verified ·
1 Parent(s): 26ab5da

Upload 12 files

Browse files
Files changed (12) hide show
  1. .gitignore +59 -0
  2. Dockerfile +16 -0
  3. INDEX.md +326 -0
  4. LICENSE +21 -0
  5. MUSIC_GUIDE.md +177 -0
  6. QUICK_START.md +203 -0
  7. README.md +186 -10
  8. TIPS_AND_TRICKS.md +425 -0
  9. admin.html +639 -0
  10. app.py +123 -0
  11. requirements.txt +2 -0
  12. valentine.html +826 -0
.gitignore ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ env/
8
+ venv/
9
+ ENV/
10
+ build/
11
+ develop-eggs/
12
+ dist/
13
+ downloads/
14
+ eggs/
15
+ .eggs/
16
+ lib/
17
+ lib64/
18
+ parts/
19
+ sdist/
20
+ var/
21
+ wheels/
22
+ *.egg-info/
23
+ .installed.cfg
24
+ *.egg
25
+
26
+ # Flask
27
+ instance/
28
+ .webassets-cache
29
+
30
+ # Uploaded files (optional - remove if you want to keep uploads in git)
31
+ uploads/*.png
32
+ uploads/*.jpg
33
+ uploads/*.jpeg
34
+ uploads/*.gif
35
+ uploads/*.webp
36
+ uploads/*.mp3
37
+ uploads/*.wav
38
+ uploads/*.ogg
39
+
40
+ # Keep uploads folder but ignore content
41
+ !uploads/.gitkeep
42
+
43
+ # IDE
44
+ .vscode/
45
+ .idea/
46
+ *.swp
47
+ *.swo
48
+ *~
49
+ .DS_Store
50
+
51
+ # Environment variables
52
+ .env
53
+ .env.local
54
+
55
+ # Logs
56
+ *.log
57
+
58
+ # OS
59
+ Thumbs.db
Dockerfile ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # استخدام نسخة بايثون خفيفة
2
+ FROM python:3.9-slim
3
+
4
+ # إعداد مجلد العمل
5
+ WORKDIR /app
6
+
7
+ # نسخ الملفات وتثبيت المكتبات
8
+ COPY requirements.txt .
9
+ RUN pip install --no-cache-dir -r requirements.txt
10
+
11
+ # نسخ باقي ملفات المشروع وإنشاء مجلد الصور بصلاحيات كاملة
12
+ COPY . .
13
+ RUN mkdir -p uploads && chmod 777 uploads
14
+
15
+ # تشغيل التطبيق
16
+ CMD ["python", "app.py"]
INDEX.md ADDED
@@ -0,0 +1,326 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 💖 Valentine's Day Interactive Project - Complete Package
2
+
3
+ ## 📦 محتويات المشروع الكامل:
4
+
5
+ ### 📄 الملفات الأساسية:
6
+ 1. **app.py** - السيرفر (Flask Backend)
7
+ 2. **requirements.txt** - متطلبات المشروع
8
+ 3. **LICENSE** - ترخيص MIT
9
+ 4. **.gitignore** - ملفات Git المستثناة
10
+
11
+ ### 🌐 صفحات HTML:
12
+ - **templates/valentine.html** - الصفحة الرئيسية التفاعلية
13
+ - **templates/admin.html** - لوحة التحكم لرفع الصور والموسيقى
14
+
15
+ ### 📚 ملفات التوثيق:
16
+ - **README.md** - الدليل الشامل للمشروع
17
+ - **QUICK_START.md** - دليل البدء السريع
18
+ - **MUSIC_GUIDE.md** - دليل الموسيقى والصوتيات
19
+ - **TIPS_AND_TRICKS.md** - نصائح وحيل التخصيص
20
+ - **INDEX.md** - هذا الملف (الفهرس)
21
+
22
+ ### 📁 المجلدات:
23
+ - **templates/** - ملفات HTML
24
+ - **uploads/** - الصور والموسيقى المرفوعة
25
+
26
+ ---
27
+
28
+ ## 🎯 المميزات الكاملة:
29
+
30
+ ### ✨ الواجهة الأمامية (Frontend):
31
+ - ✅ صفحة تفاعلية بتصميم احترافي
32
+ - ✅ أنيميشن لشخصيتي ستيتش وأنجيلا
33
+ - ✅ زرار "No" يهرب ويتصاغر تدريجياً
34
+ - ✅ زرار "Yes" يكبر تدريجياً
35
+ - ✅ 10 رسائل مختلفة عند محاولة الهروب
36
+ - ✅ تأثيرات قلوب متساقطة
37
+ - ✅ تأثيرات Confetti احتفالية
38
+ - ✅ أنيميشن ستيكرز دوارة
39
+ - ✅ موسيقى خلفية رومانسية
40
+ - ✅ زر تحكم في الموسيقى 🔊/🔇
41
+ - ✅ تصميم متجاوب (Responsive)
42
+ - ✅ يعمل على الموبايل والكمبيوتر
43
+
44
+ ### 🔧 الواجهة الخلفية (Backend):
45
+ - ✅ سيرفر Flask قوي
46
+ - ✅ رفع الصور (PNG, JPG, GIF, WEBP)
47
+ - ✅ رفع الموسيقى (MP3, WAV, OGG)
48
+ - ✅ نظام إدارة ملفات ذكي
49
+ - ✅ حذف الملفات
50
+ - ✅ معاينة الملفات
51
+ - ✅ API endpoints للصور والموسيقى
52
+ - ✅ معالجة أخطاء شاملة
53
+
54
+ ### 🎵 نظام الموسيقى:
55
+ - ✅ 5 مقاطع موسيقية رومانسية جاهزة
56
+ - ✅ اختيار عشوائي تلقائي
57
+ - ✅ نظام احتياطي ذكي
58
+ - ✅ مولد موسيقى Web Audio API
59
+ - ✅ تشغيل تلقائي
60
+ - ✅ Loop مستمر
61
+ - ✅ صوت احتفالي عند الموافقة
62
+ - ✅ تحكم كامل في التشغيل/الإيقاف
63
+
64
+ ---
65
+
66
+ ## 🚀 البدء السريع:
67
+
68
+ ```bash
69
+ # 1. التثبيت
70
+ pip install -r requirements.txt
71
+
72
+ # 2. التشغيل
73
+ python app.py
74
+
75
+ # 3. الفتح
76
+ # الصفحة الرئيسية: http://localhost:5000
77
+ # لوحة التحكم: http://localhost:5000/admin
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 📖 دليل القراءة:
83
+
84
+ ### للمبتدئين:
85
+ 1. **ابدأ هنا:** QUICK_START.md
86
+ 2. **ثم اقرأ:** README.md (القسم الأول فقط)
87
+ 3. **عند الحاجة:** MUSIC_GUIDE.md
88
+
89
+ ### للمتقدمين:
90
+ 1. **README.md** - كل التفاصيل التقنية
91
+ 2. **TIPS_AND_TRICKS.md** - التخصيصات المتقدمة
92
+ 3. **app.py** - كود Backend للتعديل
93
+
94
+ ### للمصممين:
95
+ 1. **templates/valentine.html** - الصفحة الرئيسية
96
+ 2. **templates/admin.html** - لوحة التحكم
97
+ 3. **TIPS_AND_TRICKS.md** - تخصيص الألوان والتصميم
98
+
99
+ ### لمحبي الموسيقى:
100
+ 1. **MUSIC_GUIDE.md** - كل شيء عن الموسيقى
101
+ 2. **templates/valentine.html** - كود الموسيقى
102
+
103
+ ---
104
+
105
+ ## 📊 إحصائيات المشروع:
106
+
107
+ - **عدد الملفات:** 11
108
+ - **سطور الكود:** ~1,500+
109
+ - **اللغات:** Python, HTML, CSS, JavaScript
110
+ - **المكتبات:** Flask, Web Audio API
111
+ - **الموسيقى:** 5 مقاطع + مولد ديناميكي
112
+ - **الأنيميشن:** 15+ تأثير
113
+ - **الوقت المقدر:** ~8 ساعات تطوير
114
+
115
+ ---
116
+
117
+ ## 🎨 التخصيص السريع:
118
+
119
+ ### تغيير الألوان:
120
+ ```css
121
+ /* في valentine.html */
122
+ #ff1744 /* اللون الأحمر → غيره لأي لون */
123
+ ```
124
+
125
+ ### تغيير النصوص:
126
+ ```html
127
+ <!-- في valentine.html -->
128
+ <h1>Be My Valentine</h1>
129
+ <!-- غيره لأي نص -->
130
+ ```
131
+
132
+ ### تغيير الرسائل:
133
+ ```javascript
134
+ // في valentine.html
135
+ const messages = [
136
+ "Pookie please...",
137
+ // أضف رسائلك
138
+ ];
139
+ ```
140
+
141
+ ### إضافة صورك:
142
+ 1. افتح: http://localhost:5000/admin
143
+ 2. ارفع الصور
144
+ 3. Done! ✅
145
+
146
+ ---
147
+
148
+ ## 🌐 النشر على الإنترنت:
149
+
150
+ ### الخيارات المتاحة:
151
+ 1. **PythonAnywhere** - مجاني، سهل
152
+ 2. **Heroku** - مجاني، احترافي
153
+ 3. **Render** - مجاني، سريع
154
+ 4. **Vercel** - مجاني، للمطورين
155
+ 5. **AWS/Azure** - للمحترفين
156
+
157
+ ### أسهل طريقة (PythonAnywhere):
158
+ ```
159
+ 1. www.pythonanywhere.com → إنشاء حساب
160
+ 2. Upload files → رفع المشروع
161
+ 3. Web → إنشاء تطبيق Flask
162
+ 4. Done! رابط م��اني 🎉
163
+ ```
164
+
165
+ ---
166
+
167
+ ## 🎁 استخدامات إبداعية:
168
+
169
+ ### 💖 رومانسية:
170
+ - طلب يد للزواج (Proposal)
171
+ - عيد الحب (Valentine's Day)
172
+ - ذكرى سنوية (Anniversary)
173
+ - اعتذار رومانسي (Apology)
174
+
175
+ ### 🎉 احتفالية:
176
+ - عيد ميلاد (Birthday)
177
+ - نجاح/تخرج (Graduation)
178
+ - ترقية وظيفية (Promotion)
179
+ - حفلة (Party Invitation)
180
+
181
+ ### 🤝 اجتماعية:
182
+ - دعوة صداقة (Friendship)
183
+ - دعوة لحدث (Event Invite)
184
+ - استبيان مرح (Fun Survey)
185
+ - مفاجأة (Surprise)
186
+
187
+ ---
188
+
189
+ ## 🔥 مميزات فريدة:
190
+
191
+ ### 1. نظام الموسيقى الثلاثي:
192
+ ```
193
+ 1st: موسيقى محملة من الإنترنت
194
+ ↓ (إذا فشل)
195
+ 2nd: موسيقى بديلة احتياطية
196
+ ↓ (إذا فشل)
197
+ 3rd: موسيقى مولدة بـ Web Audio API
198
+ ```
199
+
200
+ ### 2. الأنيميشن الذكي:
201
+ - كل شخصية لها توقيت مختلف
202
+ - حركات طبيعية غير متكررة
203
+ - تأثيرات تفاعلية مع الماوس
204
+
205
+ ### 3. زرار "No" الذكي:
206
+ - يهرب بطريقة عشوائية
207
+ - يصغر تدريجياً (85% كل مرة)
208
+ - يغير النص كل مرة (10 رسائل)
209
+ - يكبر زرار "Yes" معه
210
+
211
+ ### 4. نظام الملفات الذكي:
212
+ - تسمية تلقائية حسب النوع
213
+ - معاينة فورية
214
+ - حذف آمن
215
+ - معالجة أخطاء شاملة
216
+
217
+ ---
218
+
219
+ ## 📈 خطة التطوير المستقبلية:
220
+
221
+ ### المرحلة 1: ✅ مكتملة
222
+ - [x] صفحة تفاعلية
223
+ - [x] أنيميشن الشخصيات
224
+ - [x] لوحة التحكم
225
+ - [x] نظام الموسيقى
226
+
227
+ ### المرحلة 2: 🔜 قريباً
228
+ - [ ] قاعدة بيانات للردود
229
+ - [ ] إرسال إشعارات بالبريد
230
+ - [ ] Multi-language support
231
+ - [ ] Dark mode
232
+
233
+ ### المرحلة 3: 💡 أفكار مستقبلية
234
+ - [ ] معرض صور متحرك
235
+ - [ ] حائط رسائل تفاعلي
236
+ - [ ] لعبة ذاكرة بالصور
237
+ - [ ] عداد تنازلي
238
+
239
+ ---
240
+
241
+ ## 🏆 الإنجازات:
242
+
243
+ - ✅ مشروع كامل 100%
244
+ - ✅ موثق بالكامل
245
+ - ✅ جاهز للاستخدام
246
+ - ✅ سهل التخصيص
247
+ - ✅ قابل للنشر
248
+ - ✅ مجاني بالكامل
249
+ - ✅ Open Source (MIT License)
250
+
251
+ ---
252
+
253
+ ## 📞 الدعم والمساعدة:
254
+
255
+ ### إذا واجهت مشكلة:
256
+ 1. راجع **QUICK_START.md** للأساسيات
257
+ 2. راجع **README.md** للتفاصيل
258
+ 3. راجع قسم "حل المشاكل" في أي ملف
259
+ 4. ابحث في الكود عن تعليقات مفيدة
260
+
261
+ ### للتخصيص:
262
+ - **TIPS_AND_TRICKS.md** → كل شيء عن التخصيص
263
+ - **valentine.html** → الكود مع تعليقات
264
+ - **admin.html** → واجهة الإدارة
265
+
266
+ ---
267
+
268
+ ## 🎯 الخطوات التالية:
269
+
270
+ ### الآن:
271
+ ```bash
272
+ cd valentine_project
273
+ python app.py
274
+ ```
275
+
276
+ ### بعد التجربة:
277
+ 1. خصص الصور (admin panel)
278
+ 2. خصص النصوص (valentine.html)
279
+ 3. خصص الألوان (CSS)
280
+ 4. أضف موسيقتك (uploads)
281
+
282
+ ### للمشاركة:
283
+ 1. انشر على GitHub
284
+ 2. انشر على الإنترنت (PythonAnywhere)
285
+ 3. شارك مع الأصدقاء
286
+
287
+ ---
288
+
289
+ ## 🌟 شكر خاص:
290
+
291
+ - **Pixabay** - للموسيقى المجانية
292
+ - **Flask** - للإطار القوي
293
+ - **Web Audio API** - للموسيقى المولدة
294
+ - **أنت** - لاستخدام المشروع! 💖
295
+
296
+ ---
297
+
298
+ ## 📜 الترخيص:
299
+
300
+ هذا المشروع مرخص بموجب **MIT License**.
301
+ مجاني للاستخدام الشخصي والتجاري.
302
+
303
+ ---
304
+
305
+ ## 🎊 استمتع!
306
+
307
+ صُمم بـ 💖 من أجلك
308
+ فبراير 2026
309
+
310
+ ---
311
+
312
+ **Quick Links:**
313
+ - [QUICK_START.md](QUICK_START.md) - ابدأ هنا!
314
+ - [README.md](README.md) - الدليل الشامل
315
+ - [MUSIC_GUIDE.md](MUSIC_GUIDE.md) - دليل الموسيقى
316
+ - [TIPS_AND_TRICKS.md](TIPS_AND_TRICKS.md) - النصائح والحيل
317
+
318
+ **روابط مفيدة:**
319
+ - Flask: https://flask.palletsprojects.com
320
+ - Python: https://python.org
321
+ - Pixabay Music: https://pixabay.com/music
322
+ - GitHub: https://github.com
323
+
324
+ ---
325
+
326
+ 🚀 **ابدأ الآن: `python app.py`**
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Valentine Project
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
MUSIC_GUIDE.md ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🎵 دليل الموسيقى الرومانسية
2
+
3
+ ## الموسيقى الافتراضية المتضمنة:
4
+
5
+ المشروع يحتوي على **5 مقاطع موسيقية رومانسية مجانية** من Pixabay:
6
+
7
+ 1. **Romantic Piano** - بيانو رومانسي هادئ
8
+ 2. **Beautiful Love** - موسيقى حب جميلة
9
+ 3. **Tender Love** - حب رقيق
10
+ 4. **Romantic Music** - موسيقى رومانسية كلاسيكية
11
+ 5. **Sweet Love** - حب حلو
12
+
13
+ ## النظام الاحتياطي:
14
+
15
+ إذا فشل تحميل الموسيقى الخارجية، يتم استخدام **مولد موسيقى Web Audio API** الذي يخلق لحن رومانسي بسيط باستخدام النوتات الموسيقية التالية:
16
+
17
+ ### اللحن الرومانسي المولد:
18
+ ```
19
+ C5 - D5 - E5 - F5 - G5 (صعود رومانسي)
20
+ E5 - D5 - C5 (نزول ناعم)
21
+ D5 - E5 - F5 - E5 - D5 (تكرار حالم)
22
+ ```
23
+
24
+ هذا اللحن يتكرر بشكل مستمر ويخلق أجواء رومانسية هادئة.
25
+
26
+ ## كيفية إضافة موسيقتك الخاصة:
27
+
28
+ ### الطريقة 1: من لوحة التحكم (موصى بها)
29
+ 1. افتح http://localhost:5000/admin
30
+ 2. انزل لقسم "🎵 موسيقى الخلفية"
31
+ 3. اضغط "اختر ملف موسيقى"
32
+ 4. اختر ملف MP3/WAV/OGG من جهازك
33
+ 5. انتظر اكتمال الرفع
34
+ 6. ارجع للصفحة الرئيسية
35
+
36
+ ### الطريقة 2: يدوياً
37
+ 1. ضع ملف موسيقى في مجلد `uploads/`
38
+ 2. سمي الملف: `music.mp3` أو `music.wav` أو `music.ogg`
39
+ 3. أعد تحميل الصفحة
40
+
41
+ ## أفضل المصادر للموسيقى المجانية:
42
+
43
+ ### 1. Pixabay Music
44
+ - رابط: https://pixabay.com/music/
45
+ - مجاني بالكامل
46
+ - بدون حقوق ملكية
47
+ - جودة عالية
48
+
49
+ ### 2. YouTube Audio Library
50
+ - رابط: https://www.youtube.com/audiolibrary
51
+ - مكتبة ضخمة
52
+ - تصنيفات متنوعة
53
+ - تحميل مباشر
54
+
55
+ ### 3. Free Music Archive
56
+ - رابط: https://freemusicarchive.org/
57
+ - موسيقى مستقلة
58
+ - تراخيص Creative Commons
59
+ - أنواع متعددة
60
+
61
+ ### 4. Incompetech
62
+ - رابط: https://incompetech.com/music/
63
+ - موسيقى Kevin MacLeod المشهورة
64
+ - مجانية بشرط الإشارة للمصدر
65
+ - مكتبة ضخمة
66
+
67
+ ### 5. Bensound
68
+ - رابط: https://www.bensound.com/
69
+ - موسيقى احترافية
70
+ - مجانية للاستخدام الشخصي
71
+ - جودة ممتازة
72
+
73
+ ## نصائح لاختيار الموسيقى المناسبة:
74
+
75
+ ### ✅ موسيقى مناسبة:
76
+ - بيانو رومانسي
77
+ - موسيقى Instrumental (بدون كلمات)
78
+ - Ambient / Chill
79
+ - Classical Romance
80
+ - Acoustic Love Songs
81
+ - Soft Jazz
82
+
83
+ ### ❌ موسيقى غير مناسبة:
84
+ - أغاني صاخبة
85
+ - Rock / Metal
86
+ - Hip Hop سريع
87
+ - EDM قوي
88
+ - أي موسيقى تشتت الانتباه
89
+
90
+ ## الكلمات المفتاحية للبحث:
91
+
92
+ عند البحث عن موسيقى، استخدم هذه الكلمات:
93
+ - "romantic piano"
94
+ - "love instrumental"
95
+ - "romantic background music"
96
+ - "soft romantic music"
97
+ - "valentine music"
98
+ - "romantic ambient"
99
+ - "tender love music"
100
+
101
+ ## المواصفات التقنية الموصى بها:
102
+
103
+ - **الصيغة:** MP3 (الأفضل للتوافق)
104
+ - **Bitrate:** 128-192 kbps (توازن بين الجودة والحجم)
105
+ - **Mono/Stereo:** Stereo لتجربة أفضل
106
+ - **حجم الملف:** 2-5 MB مثالي
107
+ - **المدة:** 2-5 دقائق (مع Loop)
108
+ - **التردد:** 44.1 kHz
109
+
110
+ ## استكشاف الأخطاء:
111
+
112
+ ### المشكلة: الموسيقى لا تشتغل
113
+ **الحلول:**
114
+ 1. تأكد من تفعيل الصوت في المتصفح
115
+ 2. اضغط على زر الموسيقى 🔊 يدوياً
116
+ 3. جرب متصفح آخر
117
+ 4. امسح الكاش وأعد تحميل الصفحة
118
+
119
+ ### المشكلة: الموسيقى تتقطع
120
+ **الحلول:**
121
+ 1. استخدم ملف أصغر حجماً
122
+ 2. تأكد من سرعة الإنترنت
123
+ 3. حمل الموسيقى على السيرفر المحلي
124
+
125
+ ### المشكلة: الموسيقى صوتها عالي جداً
126
+ **الحلول:**
127
+ 1. عدل مستوى الصوت من المتصفح
128
+ 2. أو عدل في الكود هنا:
129
+ ```javascript
130
+ bgMusic.volume = 0.5; // قيمة من 0.0 إلى 1.0
131
+ ```
132
+
133
+ ## التخصيص المتقدم:
134
+
135
+ ### تغيير حجم الصوت في الكود:
136
+ ```javascript
137
+ // في ملف valentine.html
138
+ bgMusic.volume = 0.3; // صوت منخفض (30%)
139
+ bgMusic.volume = 0.7; // صوت متوسط-عالي (70%)
140
+ ```
141
+
142
+ ### إضافة Fade In/Out:
143
+ ```javascript
144
+ // Fade In
145
+ let volume = 0;
146
+ const fadeIn = setInterval(() => {
147
+ if (volume < 0.5) {
148
+ volume += 0.05;
149
+ bgMusic.volume = volume;
150
+ } else {
151
+ clearInterval(fadeIn);
152
+ }
153
+ }, 100);
154
+ ```
155
+
156
+ ### تغيير نوع النغمة المولدة:
157
+ ```javascript
158
+ // في playNote function
159
+ oscillator.type = 'sine'; // ناعم (رومانسي)
160
+ oscillator.type = 'triangle'; // متوسط
161
+ oscillator.type = 'square'; // إلكتروني
162
+ oscillator.type = 'sawtooth'; // قوي
163
+ ```
164
+
165
+ ## قائمة تشغيل رومانسية موصى بها:
166
+
167
+ للحصول على تجربة متكاملة، استخدم هذه المقاطع بالترتيب:
168
+
169
+ 1. **البداية:** موسيقى هادئة جداً (Piano Ambient)
170
+ 2. **الوسط:** موسيقى أكثر حيوية (Romantic Strings)
171
+ 3. **النهاية:** موسيقى احتفالية (Romantic Celebration)
172
+
173
+ ---
174
+
175
+ **ملاحظة:** جميع الموسيقى المستخدمة في المشروع هي موسيقى مجانية من Pixabay ومرخصة للاستخدام التجاري والشخصي بدون قيود.
176
+
177
+ 🎵 استمتع بالموسيقى الرومانسية! 💖
QUICK_START.md ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🚀 دليل البدء السريع - Quick Start Guide
2
+
3
+ ## ⚡ التشغيل في 3 خطوات:
4
+
5
+ ### 1️⃣ تثبيت Flask (مرة واحدة فقط)
6
+ ```bash
7
+ pip install flask --break-system-packages
8
+ ```
9
+
10
+ ### 2️⃣ تشغيل السيرفر
11
+ ```bash
12
+ cd valentine_project
13
+ python app.py
14
+ ```
15
+
16
+ ### 3️⃣ فتح المتصفح
17
+ افتح أحد الروابط التالية:
18
+ - **الصفحة الرئيسية:** http://localhost:5000
19
+ - **لوحة التحكم:** http://localhost:5000/admin
20
+
21
+ ---
22
+
23
+ ## 📋 هيكل المشروع:
24
+
25
+ ```
26
+ valentine_project/
27
+
28
+ ├── app.py # السيرفر (Backend)
29
+ ├── README.md # الدليل الشامل
30
+ ├── MUSIC_GUIDE.md # دليل الموسيقى
31
+ ├── QUICK_START.md # هذا الملف
32
+
33
+ ├── templates/ # صفحات HTML
34
+ │ ├── valentine.html # الصفحة الرئيسية
35
+ │ └── admin.html # لوحة التحكم
36
+
37
+ └── uploads/ # الصور والموسيقى المرفوعة
38
+ └── (سيتم إنشاؤه تلقائياً)
39
+ ```
40
+
41
+ ---
42
+
43
+ ## 🎨 التخصيص السريع:
44
+
45
+ ### رفع الصور والموسيقى:
46
+ 1. افتح: http://localhost:5000/admin
47
+ 2. اختر نوع الملف:
48
+ - 💙 **ستيتش** → صورة الشخصية اليسرى
49
+ - 🐱 **أنجيلا** → صورة الشخصية اليمنى
50
+ - ⭐ **ستيكر 1** → ركن علوي أيمن
51
+ - ✨ **ستيكر 2** → ركن سفلي أيسر
52
+ - 🎨 **خلفية** → خلفية الصفحة
53
+ - 🎵 **موسيقى** → ملف صوتي
54
+ 3. اضغط "اختر ملف" وارفع
55
+ 4. ارجع للصفحة الرئيسية وشوف التغيير!
56
+
57
+ ---
58
+
59
+ ## 🎵 الموسيقى:
60
+
61
+ - **بدون رفع:** موسيقى رومانسية تشتغل تلقائياً (5 مقاطع عشوائية)
62
+ - **مع رفع:** ارفع موسيقتك الخاصة (MP3, WAV, OGG)
63
+ - **التحكم:** زر 🔊 في الركن الأيسر السفلي
64
+
65
+ ---
66
+
67
+ ## ✅ نصائح مهمة:
68
+
69
+ ### للصور:
70
+ - ✅ استخدم PNG بخلفية شفافة
71
+ - ✅ حجم مناسب: 500x500 بكسل أو أكبر
72
+ - ✅ ابحث عن "stitch png" و "angela png" على Google
73
+
74
+ ### للموسيقى:
75
+ - ✅ صيغة MP3 (الأفضل)
76
+ - ✅ حجم صغير: 2-5 MB
77
+ - ✅ موسيقى هادئة رومانسية
78
+ - ✅ مصادر مجانية: Pixabay, YouTube Audio Library
79
+
80
+ ---
81
+
82
+ ## 🐛 حل المشاكل الشائعة:
83
+
84
+ ### المشكلة: `pip: command not found`
85
+ **الحل:**
86
+ ```bash
87
+ python -m pip install flask --break-system-packages
88
+ # أو
89
+ python3 -m pip install flask --break-system-packages
90
+ ```
91
+
92
+ ### المشكلة: `Port 5000 already in use`
93
+ **الحل:** غير المنفذ في `app.py`:
94
+ ```python
95
+ app.run(debug=True, host='0.0.0.0', port=5001) # استخدم 5001 بدلاً من 5000
96
+ ```
97
+
98
+ ### المشكلة: الصور لا تظهر
99
+ **الحل:**
100
+ 1. تأكد من رفع الصور من لوحة التحكم
101
+ 2. تحقق من وجود مجلد `uploads/`
102
+ 3. امسح كاش المتصفح (Ctrl+Shift+Delete)
103
+ 4. أعد تحميل الصفحة (Ctrl+F5)
104
+
105
+ ### المشكلة: الموسيقى لا تشتغل
106
+ **الحل:**
107
+ 1. اضغط زر 🔊 يدوياً
108
+ 2. تأكد من تفعيل الصوت في المتصفح
109
+ 3. جرب متصفح آخر (Chrome أفضل)
110
+ 4. تحقق من حجم ملف الموسيقى (أقل من 16MB)
111
+
112
+ ---
113
+
114
+ ## 🌐 نشر المشروع على الإنترنت:
115
+
116
+ ### خيار 1: PythonAnywhere (مجاني)
117
+ 1. أنشئ حساب على: https://www.pythonanywhere.com
118
+ 2. ارفع ملفات المشروع
119
+ 3. اضبط إعدادات Flask
120
+ 4. احصل على رابط مجاني!
121
+
122
+ ### خيار 2: Heroku
123
+ 1. أنشئ حساب على: https://www.heroku.com
124
+ 2. ثبت Heroku CLI
125
+ 3. أضف ملفات `Procfile` و `requirements.txt`
126
+ 4. انشر المشروع
127
+
128
+ ### خيار 3: Render (سهل جداً)
129
+ 1. أنشئ حساب على: https://render.com
130
+ 2. اربط مع GitHub
131
+ 3. انشر تلقائياً
132
+
133
+ ---
134
+
135
+ ## 📞 المساعدة:
136
+
137
+ ### الملفات المرجعية:
138
+ - **README.md** → الدليل الشامل للمشروع
139
+ - **MUSIC_GUIDE.md** → كل شيء عن الموسيقى
140
+ - **app.py** → كود Backend (Python/Flask)
141
+ - **valentine.html** → الصفحة الرئيسية
142
+ - **admin.html** → لوحة التحكم
143
+
144
+ ---
145
+
146
+ ## 🎉 خطوات الاستخدام النموذجية:
147
+
148
+ ```bash
149
+ # 1. تثبيت Flask (مرة واحدة)
150
+ pip install flask --break-system-packages
151
+
152
+ # 2. الانتقال للمجلد
153
+ cd valentine_project
154
+
155
+ # 3. تشغيل السيرفر
156
+ python app.py
157
+
158
+ # 4. في متصفح آخر، افتح:
159
+ # http://localhost:5000/admin
160
+
161
+ # 5. ارفع الصور والموسيقى
162
+
163
+ # 6. ارجع لـ:
164
+ # http://localhost:5000
165
+
166
+ # 7. استمتع! 🎉
167
+ ```
168
+
169
+ ---
170
+
171
+ ## 💡 أفكار إضافية:
172
+
173
+ ### للأصدقاء:
174
+ - غير النصوص في `valentine.html`
175
+ - اخت�� صور مضحكة بدلاً من رومانسية
176
+ - استخدم موسيقى كوميدية
177
+
178
+ ### للعائلة:
179
+ - غير "Valentine" لـ "Mother's Day" أو "Birthday"
180
+ - استخدم صور الأم أو المحتفل به
181
+ - عدّل الرسائل حسب المناسبة
182
+
183
+ ### احترافي:
184
+ - أضف قاعدة بيانات لحفظ الردود
185
+ - أضف نموذج لكتابة رسالة شخصية
186
+ - أرسل إشعار عبر البريد عند الموافقة
187
+
188
+ ---
189
+
190
+ ## 🎯 الخطوة التالية:
191
+
192
+ **ابدأ الآن:**
193
+ ```bash
194
+ python app.py
195
+ ```
196
+
197
+ ثم افتح: **http://localhost:5000** 🚀
198
+
199
+ ---
200
+
201
+ صُمم بـ 💖 خصيصاً لك!
202
+
203
+ تاريخ آخر تحديث: فبراير 2026
README.md CHANGED
@@ -1,10 +1,186 @@
1
- ---
2
- title: Lilo
3
- emoji: 🚀
4
- colorFrom: pink
5
- colorTo: red
6
- sdk: docker
7
- pinned: false
8
- ---
9
-
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 💖 Valentine's Day Interactive Web App
2
+
3
+ مشروع تفاعلي لعيد الحب مع أنيميشن ستيتش وأنجيلا!
4
+
5
+ ## 🎯 المميزات
6
+
7
+ - ✨ صفحة تفاعلية بتصميم احترافي
8
+ - 💙 أنيميشن لشخصيتي ستيتش وأنجيلا
9
+ - 🎮 زرار "No" بيهرب وبيصغر
10
+ - 💕 زرار "Yes" بيكبر تدريجياً
11
+ - 🎉 تأثيرات قلوب وconfetti عند الموافقة
12
+ - 📸 لوحة تحكم لرفع وتخصيص الصور
13
+ - 🎨 إمكانية تغيير الخلفية والستيكرز
14
+ - 🎵 **موسيقى خلفية رومانسية مع زر تحكم**
15
+ - 🔊 تحكم كامل في تشغيل/إيقاف الموسيقى
16
+
17
+ ## 📦 المتطلبات
18
+
19
+ - Python 3.8+
20
+ - Flask
21
+
22
+ ## 🚀 كيفية التشغيل
23
+
24
+ ### 1. تثبيت المتطلبات
25
+
26
+ ```bash
27
+ pip install flask --break-system-packages
28
+ ```
29
+
30
+ ### 2. تشغيل السيرفر
31
+
32
+ ```bash
33
+ cd valentine_project
34
+ python app.py
35
+ ```
36
+
37
+ ### 3. فتح المتصفح
38
+
39
+ - **الصفحة الرئيسية:** http://localhost:5000
40
+ - **لوحة التحكم:** http://localhost:5000/admin
41
+
42
+ ## 📁 هيكل المشروع
43
+
44
+ ```
45
+ valentine_project/
46
+
47
+ ├── app.py # السيرفر (Backend)
48
+ ├── uploads/ # مجلد الصور المرفوعة
49
+
50
+ ├── templates/
51
+ │ ├── valentine.html # الصفحة الرئيسية
52
+ │ └── admin.html # لوحة التحكم
53
+
54
+ └── static/ # (اختياري)
55
+ ├── images/
56
+ ├── css/
57
+ └── js/
58
+ ```
59
+
60
+ ## 🎨 كيفية تخصيص الصور
61
+
62
+ ### من لوحة التحكم (موصى به):
63
+
64
+ 1. افتح http://localhost:5000/admin
65
+ 2. اختر نوع الصورة (ستيتش، أنجيلا، ستيكر، خلفية)
66
+ 3. ارفع الصورة
67
+ 4. اضغط "معاينة الصفحة" لرؤية النتيجة
68
+
69
+ ### أنواع الصور المدعومة:
70
+
71
+ - **ستيتش** - الشخصية على اليسار
72
+ - **أنجيلا** - الشخصية على اليمين
73
+ - **ستيكر 1** - ركن علوي أيمن
74
+ - **ستيكر 2** - ركن سفلي أيسر
75
+ - **خلفية** - خلفية الصفحة كاملة
76
+ - **🎵 موسيقى** - ملف صوتي للخلفية
77
+
78
+ ### صيغ الملفات المدعومة:
79
+
80
+ **للصور:**
81
+ - PNG (مفضل للشفافية)
82
+ - JPG/JPEG
83
+ - GIF
84
+ - WEBP
85
+
86
+ **للموسيقى:**
87
+ - MP3 (الأكثر شيوعاً)
88
+ - WAV
89
+ - OGG
90
+
91
+ **الحد الأقصى:** 16MB
92
+
93
+ ## 💡 نصائح للحصول على أفضل نتيجة
94
+
95
+ 1. **للشخصيات (ستيتش وأنجيلا):**
96
+ - استخدم صور PNG بخلفية شفافة
97
+ - الحجم المثالي: 500x500 بكسل أو أكبر
98
+ - تأكد أن الشخصية في منتصف الصورة
99
+
100
+ 2. **للستيكرز:**
101
+ - صور صغيرة ومرحة
102
+ - خلفية شفافة (PNG)
103
+ - الحجم المثالي: 200x200 بكسل
104
+
105
+ 3. **للخلفية:**
106
+ - صورة عالية الدقة
107
+ - الحجم المثالي: 1920x1080 أو أعلى
108
+ - ألوان هادئة لا تطغى على المحتوى
109
+
110
+ 4. **🎵 للموسيقى:**
111
+ - استخدم موسيقى رومانسية هادئة
112
+ - تأكد من أن الملف بصيغة MP3 للتوافق الأفضل
113
+ - يُفضل ملفات صغيرة (أقل من 5MB) للتحميل السريع
114
+ - مواقع للحصول على موسيقى مجانية:
115
+ - Pixabay Music
116
+ - YouTube Audio Library
117
+ - Free Music Archive
118
+
119
+ ## 🎮 كيفية الاستخدام
120
+
121
+ 1. عند فتح الصفحة الرئيسية، ستظهر ستيتش وأنجيلا مع أنيميشن
122
+ 2. **زر الموسيقى 🔊** في الركن الأيسر السفلي للتحكم في الصوت
123
+ 3. حاول الضغط على زرار "No" - هيهرب منك! 😄
124
+ 4. زرار "No" هيصغر وزرار "Yes" هيكبر
125
+ 5. لما تضغط "Yes"، هيحصل احتفال بالقلوب والconfetti! 🎉
126
+
127
+ ### 🎵 التحكم في الموسيقى:
128
+ - اضغط على زر 🔊 لتشغيل الموسيقى
129
+ - اضغط مرة أخرى لإيقافها 🔇
130
+ - الموسيقى تعمل بشكل تلقائي عند أول تفاعل مع الصفحة
131
+ - إذا لم ترفع موسيقى خاصة، ستشتغل موسيقى افتراضية
132
+
133
+ ## 🔧 التخصيص المتقدم
134
+
135
+ ### تغيير الألوان في `valentine.html`:
136
+
137
+ ```css
138
+ /* اللون الأساسي */
139
+ #ff1744 /* الأحمر الرومانسي */
140
+
141
+ /* الخلفية */
142
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
143
+ ```
144
+
145
+ ### تغيير الرسائل في JavaScript:
146
+
147
+ ```javascript
148
+ const messages = [
149
+ "Pookie please... 🥺",
150
+ "Are you sure? 💔",
151
+ // أضف رسائلك هنا
152
+ ];
153
+ ```
154
+
155
+ ## 🐛 حل المشاكل
156
+
157
+ **الصور لا تظهر؟**
158
+ - تأكد من أن الصور في مجلد `uploads/`
159
+ - تحقق من صيغة الملف (PNG, JPG, GIF, WEBP)
160
+ - جرب رفع الصورة مرة أخرى من لوحة التحكم
161
+
162
+ **السيرفر لا يعمل؟**
163
+ - تأكد من تثبيت Flask: `pip install flask --break-system-packages`
164
+ - تحقق من المنفذ 5000 غير مستخدم
165
+ - جرب منفذ مختلف: `app.run(port=5001)`
166
+
167
+ **زرار "No" لا يتحرك؟**
168
+ - افتح Developer Console (F12)
169
+ - تحقق من عدم وجود أخطاء JavaScript
170
+
171
+ **🎵 الموسيقى لا تشتغل؟**
172
+ - بعض المتصفحات تمنع التشغيل التلقائي - اضغط زر الموسيقى يدوياً
173
+ - تأكد من أن ملف الموسيقى بصيغة MP3 أو WAV
174
+ - تحقق من حجم الملف (أقل من 16MB)
175
+ - جرب مسح الكاش (Ctrl+Shift+Delete)
176
+ - تأكد من أن مستوى صوت الجهاز مرتفع
177
+
178
+ ## 📝 ملاحظات
179
+
180
+ - المشروع للاستخدام الشخصي والترفيهي
181
+ - يمكن نشره على Heroku أو PythonAnywhere
182
+ - جميع الصور المرفوعة تُحفظ في `uploads/`
183
+
184
+ ## 🎉 استمتع!
185
+
186
+ صمم بـ 💖 من أجلك!
TIPS_AND_TRICKS.md ADDED
@@ -0,0 +1,425 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 💡 نصائح وحيل - Tips & Tricks
2
+
3
+ ## 🎨 تخصيصات متقدمة:
4
+
5
+ ### 1. تغيير الألوان الرئيسية:
6
+
7
+ في ملف `templates/valentine.html`، ابحث عن:
8
+
9
+ ```css
10
+ /* اللون الأحمر الرومانسي */
11
+ #ff1744 /* غيره لأي لون تحبه */
12
+
13
+ /* أمثلة: */
14
+ #ff1744 /* أحمر رومانسي (الافتراضي) */
15
+ #e91e63 /* وردي غامق */
16
+ #9c27b0 /* بنفسجي */
17
+ #2196f3 /* أزرق */
18
+ #4caf50 /* أخضر */
19
+ #ff9800 /* برتقالي */
20
+ ```
21
+
22
+ ### 2. تغيير الخلفية المتدرجة:
23
+
24
+ ```css
25
+ /* الخلفية الحالية */
26
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
27
+
28
+ /* خلفيات رومانسية بديلة: */
29
+
30
+ /* وردي رومانسي */
31
+ background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
32
+
33
+ /* أحمر دافئ */
34
+ background: linear-gradient(135deg, #fa709a 0%, #fee140 100%);
35
+
36
+ /* أزرق حالم */
37
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
38
+
39
+ /* بنفسجي ساحر */
40
+ background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
41
+
42
+ /* برتقالي غروب */
43
+ background: linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%);
44
+ ```
45
+
46
+ ### 3. تغيير نصوص الرسائل:
47
+
48
+ في `valentine.html`، ابحث عن:
49
+
50
+ ```javascript
51
+ const messages = [
52
+ "Pookie please... 🥺",
53
+ "Are you sure? 💔",
54
+ // أضف رسائلك هنا!
55
+ ];
56
+ ```
57
+
58
+ **أمثلة عربية:**
59
+ ```javascript
60
+ const messages = [
61
+ "من فضلك قول أيوة 🥺",
62
+ "متأكد؟ 💔",
63
+ "يا حبيبي قول أيوة 🙏",
64
+ "هتكسر قلبي؟ 😢",
65
+ "اضغط أيوة! 💕",
66
+ "تعالى! 😭",
67
+ "رجاءً؟ 🥹",
68
+ "هزعل 💔",
69
+ ];
70
+ ```
71
+
72
+ ### 4. تغيير السؤال الرئيسي:
73
+
74
+ ```html
75
+ <!-- من -->
76
+ <p class="question">Will you be my Valentine?</p>
77
+
78
+ <!-- إلى (أمثلة) -->
79
+ <p class="question">هتكون حبيبي؟ 💖</p>
80
+ <p class="question">عايز تكون صديقي؟ 🎉</p>
81
+ <p class="question">تتزوجني؟ 💍</p>
82
+ <p class="question">هتيجي معايا؟ 🎊</p>
83
+ ```
84
+
85
+ ### 5. تغيير نص زرار Yes:
86
+
87
+ ```html
88
+ <!-- من -->
89
+ <button class="yes-button" onclick="handleYesClick()">Yes 💖</button>
90
+
91
+ <!-- إلى -->
92
+ <button class="yes-button" onclick="handleYesClick()">أيوة 💖</button>
93
+ <button class="yes-button" onclick="handleYesClick()">طبعاً! 💕</button>
94
+ <button class="yes-button" onclick="handleYesClick()">موافق 😍</button>
95
+ ```
96
+
97
+ ---
98
+
99
+ ## 🎵 تخصيصات الموسيقى:
100
+
101
+ ### تغيير حجم الصوت:
102
+
103
+ في `valentine.html`:
104
+
105
+ ```javascript
106
+ // البحث عن
107
+ bgMusic.volume = 0.3; // 30%
108
+
109
+ // التغيير إلى
110
+ bgMusic.volume = 0.5; // 50%
111
+ bgMusic.volume = 0.7; // 70%
112
+ bgMusic.volume = 1.0; // 100% (كامل)
113
+ ```
114
+
115
+ ### إضافة Fade In (تدريج الصوت):
116
+
117
+ ```javascript
118
+ function playMusicWithFade() {
119
+ bgMusic.volume = 0;
120
+ bgMusic.play();
121
+
122
+ let volume = 0;
123
+ const fadeInterval = setInterval(() => {
124
+ if (volume < 0.5) {
125
+ volume += 0.05;
126
+ bgMusic.volume = volume;
127
+ } else {
128
+ clearInterval(fadeInterval);
129
+ }
130
+ }, 100);
131
+ }
132
+ ```
133
+
134
+ ### تغيير الموسيقى عند الضغط على Yes:
135
+
136
+ ```javascript
137
+ function handleYesClick() {
138
+ // إيقاف الموسيقى الخلفية
139
+ bgMusic.pause();
140
+
141
+ // تشغيل موسيقى احتفالية
142
+ const celebrationMusic = new Audio('your-celebration-music.mp3');
143
+ celebrationMusic.play();
144
+
145
+ // باقي الكود...
146
+ }
147
+ ```
148
+
149
+ ---
150
+
151
+ ## 🎭 تأثيرات بصرية إضافية:
152
+
153
+ ### 1. إضافة تأثير Snow (ثلج):
154
+
155
+ ```javascript
156
+ function createSnow() {
157
+ for (let i = 0; i < 50; i++) {
158
+ setTimeout(() => {
159
+ const snowflake = document.createElement('div');
160
+ snowflake.innerHTML = '❄️';
161
+ snowflake.style.position = 'fixed';
162
+ snowflake.style.left = Math.random() * 100 + '%';
163
+ snowflake.style.top = '-20px';
164
+ snowflake.style.fontSize = Math.random() * 20 + 10 + 'px';
165
+ snowflake.style.opacity = Math.random();
166
+ snowflake.style.zIndex = '9999';
167
+ snowflake.style.pointerEvents = 'none';
168
+ document.body.appendChild(snowflake);
169
+
170
+ snowflake.animate([
171
+ { transform: 'translateY(0) rotate(0deg)' },
172
+ { transform: `translateY(${window.innerHeight + 100}px) rotate(360deg)` }
173
+ ], {
174
+ duration: Math.random() * 3000 + 2000,
175
+ easing: 'linear'
176
+ }).onfinish = () => snowflake.remove();
177
+ }, i * 100);
178
+ }
179
+ }
180
+ ```
181
+
182
+ ### 2. إضافة تأثير Sparkle عند التمرير:
183
+
184
+ ```javascript
185
+ document.addEventListener('mousemove', (e) => {
186
+ if (Math.random() > 0.9) { // 10% فرصة
187
+ const sparkle = document.createElement('div');
188
+ sparkle.className = 'sparkle';
189
+ sparkle.style.left = e.pageX + 'px';
190
+ sparkle.style.top = e.pageY + 'px';
191
+ document.body.appendChild(sparkle);
192
+ setTimeout(() => sparkle.remove(), 1000);
193
+ }
194
+ });
195
+ ```
196
+
197
+ ### 3. إضافة انفجار قلوب عند الضغط:
198
+
199
+ ```javascript
200
+ document.addEventListener('click', (e) => {
201
+ for (let i = 0; i < 5; i++) {
202
+ const heart = document.createElement('div');
203
+ heart.textContent = '💖';
204
+ heart.style.position = 'fixed';
205
+ heart.style.left = e.pageX + 'px';
206
+ heart.style.top = e.pageY + 'px';
207
+ heart.style.fontSize = '20px';
208
+ heart.style.pointerEvents = 'none';
209
+ document.body.appendChild(heart);
210
+
211
+ const angle = (Math.PI * 2 * i) / 5;
212
+ const distance = 100;
213
+
214
+ heart.animate([
215
+ { transform: 'translate(0, 0) scale(1)', opacity: 1 },
216
+ {
217
+ transform: `translate(${Math.cos(angle) * distance}px, ${Math.sin(angle) * distance}px) scale(0)`,
218
+ opacity: 0
219
+ }
220
+ ], {
221
+ duration: 1000,
222
+ easing: 'ease-out'
223
+ }).onfinish = () => heart.remove();
224
+ }
225
+ });
226
+ ```
227
+
228
+ ---
229
+
230
+ ## 📱 تحسينات للموبايل:
231
+
232
+ ### جعل النصوص أصغر على الموبايل:
233
+
234
+ ```css
235
+ @media (max-width: 768px) {
236
+ h1 {
237
+ font-size: 1.8em;
238
+ }
239
+
240
+ .question {
241
+ font-size: 1.3em;
242
+ }
243
+
244
+ .yes-button {
245
+ font-size: 1.5em;
246
+ padding: 15px 40px;
247
+ }
248
+
249
+ .container {
250
+ padding: 30px;
251
+ }
252
+ }
253
+ ```
254
+
255
+ ### منع Zoom على الموبايل:
256
+
257
+ في `<head>`:
258
+ ```html
259
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
260
+ ```
261
+
262
+ ---
263
+
264
+ ## 🎯 إضافات وظيفية:
265
+
266
+ ### 1. عداد للمحاولات:
267
+
268
+ ```javascript
269
+ let noClickCount = 0;
270
+
271
+ function moveButton() {
272
+ noClickCount++;
273
+
274
+ if (noClickCount === 5) {
275
+ alert("كفاية يا حبيبي! قول أيوة 😭");
276
+ }
277
+
278
+ if (noClickCount === 10) {
279
+ alert("طيب، هديك آخر فرصة! 💔");
280
+ }
281
+
282
+ // باقي الكود...
283
+ }
284
+ ```
285
+
286
+ ### 2. حفظ الإجابة:
287
+
288
+ ```javascript
289
+ function handleYesClick() {
290
+ // حفظ في Local Storage
291
+ localStorage.setItem('valentineAnswer', 'yes');
292
+ localStorage.setItem('valentineDate', new Date().toISOString());
293
+
294
+ // باقي الكود...
295
+ }
296
+
297
+ // عند تحميل الصفحة
298
+ window.onload = function() {
299
+ const answer = localStorage.getItem('valentineAnswer');
300
+ if (answer === 'yes') {
301
+ alert("كنت قلت أيوة قبل كده! 💖");
302
+ }
303
+ };
304
+ ```
305
+
306
+ ### 3. مؤقت للعرض:
307
+
308
+ ```javascript
309
+ let timeRemaining = 60; // 60 ثانية
310
+
311
+ const timer = setInterval(() => {
312
+ timeRemaining--;
313
+ console.log(`Time remaining: ${timeRemaining}s`);
314
+
315
+ if (timeRemaining === 30) {
316
+ alert("باقي 30 ثانية! ⏰");
317
+ }
318
+
319
+ if (timeRemaining === 0) {
320
+ clearInterval(timer);
321
+ alert("انتهى الوقت! العرض انتهى 😢");
322
+ document.body.style.filter = 'grayscale(100%)';
323
+ }
324
+ }, 1000);
325
+ ```
326
+
327
+ ---
328
+
329
+ ## 🌟 مناسبات أخرى:
330
+
331
+ ### عيد ميلاد (Birthday):
332
+
333
+ ```javascript
334
+ // تغيير:
335
+ h1: "Happy Birthday 🎂"
336
+ question: "Come to my party?"
337
+ messages: ["Please come! 🎉", "Don't miss it! 🎈", ...]
338
+ ```
339
+
340
+ ### الزواج (Proposal):
341
+
342
+ ```javascript
343
+ h1: "Will You Marry Me? 💍"
344
+ question: "Be my wife/husband?"
345
+ messages: ["Think about it... 💭", "I'll wait forever 💖", ...]
346
+ // أضف صورة خاتم!
347
+ ```
348
+
349
+ ### صداقة (Friendship):
350
+
351
+ ```javascript
352
+ h1: "Be My Best Friend 👯"
353
+ question: "Wanna be BFFs?"
354
+ messages: ["Come on! 🤝", "We'll have fun! 🎮", ...]
355
+ ```
356
+
357
+ ---
358
+
359
+ ## 🔧 أدوات مساعدة:
360
+
361
+ ### مواقع للصور:
362
+ - **Remove.bg** - إزالة الخلفية من الصور
363
+ - **Pixabay** - صور مجانية
364
+ - **Flaticon** - أيقونات مجانية
365
+ - **PNG Tree** - صور PNG بخلفية شفافة
366
+
367
+ ### مواقع للموسيقى:
368
+ - **Pixabay Music** - موسيقى مجانية
369
+ - **YouTube Audio Library** - مكتبة ضخمة
370
+ - **Bensound** - موسيقى احترافية
371
+ - **Free Music Archive** - موسيقى متنوعة
372
+
373
+ ### أدوات التصميم:
374
+ - **Coolors.co** - مولد ألوان متناسقة
375
+ - **Gradient Generator** - مولد خلفيات متدرجة
376
+ - **Google Fonts** - خطوط مجانية
377
+
378
+ ---
379
+
380
+ ## 🚀 نشر على الإنترنت:
381
+
382
+ ### خطوات PythonAnywhere (مجاني):
383
+
384
+ ```bash
385
+ # 1. إنشاء حساب على pythonanywhere.com
386
+ # 2. رفع الملفات
387
+ # 3. في Bash Console:
388
+ pip install flask --user
389
+
390
+ # 4. إعداد Web App
391
+ # Web -> Add a new web app
392
+ # Python 3.x -> Manual configuration
393
+
394
+ # 5. في WSGI file:
395
+ import sys
396
+ sys.path.append('/home/yourusername/valentine_project')
397
+
398
+ from app import app as application
399
+ ```
400
+
401
+ ---
402
+
403
+ ## 🎁 أفكار إبداعية:
404
+
405
+ 1. **Multi-Language Support**: أضف زر لتغيير اللغة
406
+ 2. **Dark Mode**: أضف زر للوضع الليلي
407
+ 3. **Countdown Timer**: عداد تنازلي للمناسبة
408
+ 4. **Photo Gallery**: معرض صور للذكريات
409
+ 5. **Message Wall**: حائط رسائل من الأصدقاء
410
+ 6. **Quiz Game**: اختبار عن العلاقة
411
+ 7. **Memory Game**: لعبة ذاكرة بالصور
412
+ 8. **Love Calculator**: حاسبة التوافق (للمرح!)
413
+
414
+ ---
415
+
416
+ ## 📚 موارد تعليمية:
417
+
418
+ - **Flask Documentation**: flask.palletsprojects.com
419
+ - **HTML/CSS**: w3schools.com
420
+ - **JavaScript**: javascript.info
421
+ - **Web Audio API**: developer.mozilla.org/Web_Audio_API
422
+
423
+ ---
424
+
425
+ استمتع بالتخصيص! 🎨💖✨
admin.html ADDED
@@ -0,0 +1,639 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ar" dir="rtl">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>لوحة التحكم - تخصيص الصور 💖</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ body {
15
+ font-family: 'Arial', sans-serif;
16
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
17
+ min-height: 100vh;
18
+ padding: 20px;
19
+ }
20
+
21
+ .container {
22
+ max-width: 1200px;
23
+ margin: 0 auto;
24
+ background: white;
25
+ border-radius: 20px;
26
+ padding: 40px;
27
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
28
+ }
29
+
30
+ h1 {
31
+ text-align: center;
32
+ color: #ff1744;
33
+ margin-bottom: 10px;
34
+ font-size: 2.5em;
35
+ }
36
+
37
+ .subtitle {
38
+ text-align: center;
39
+ color: #666;
40
+ margin-bottom: 40px;
41
+ font-size: 1.1em;
42
+ }
43
+
44
+ .upload-sections {
45
+ display: grid;
46
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
47
+ gap: 30px;
48
+ margin-bottom: 40px;
49
+ }
50
+
51
+ .upload-card {
52
+ background: #f8f9fa;
53
+ border-radius: 15px;
54
+ padding: 25px;
55
+ border: 2px dashed #ddd;
56
+ transition: all 0.3s;
57
+ }
58
+
59
+ .upload-card:hover {
60
+ border-color: #ff1744;
61
+ transform: translateY(-5px);
62
+ box-shadow: 0 5px 20px rgba(255, 23, 68, 0.2);
63
+ }
64
+
65
+ .upload-card h3 {
66
+ color: #ff1744;
67
+ margin-bottom: 15px;
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 10px;
71
+ }
72
+
73
+ .upload-card p {
74
+ color: #666;
75
+ font-size: 0.9em;
76
+ margin-bottom: 15px;
77
+ }
78
+
79
+ .file-input-wrapper {
80
+ position: relative;
81
+ overflow: hidden;
82
+ display: inline-block;
83
+ width: 100%;
84
+ }
85
+
86
+ .file-input-wrapper input[type=file] {
87
+ position: absolute;
88
+ left: -9999px;
89
+ }
90
+
91
+ .file-input-label {
92
+ display: block;
93
+ padding: 15px;
94
+ background: #ff1744;
95
+ color: white;
96
+ text-align: center;
97
+ border-radius: 10px;
98
+ cursor: pointer;
99
+ transition: all 0.3s;
100
+ font-weight: bold;
101
+ }
102
+
103
+ .file-input-label:hover {
104
+ background: #d81b60;
105
+ transform: scale(1.02);
106
+ }
107
+
108
+ .file-input-label:active {
109
+ transform: scale(0.98);
110
+ }
111
+
112
+ .preview-container {
113
+ margin-top: 15px;
114
+ min-height: 150px;
115
+ background: white;
116
+ border-radius: 10px;
117
+ display: flex;
118
+ justify-content: center;
119
+ align-items: center;
120
+ overflow: hidden;
121
+ position: relative;
122
+ }
123
+
124
+ .preview-container img {
125
+ max-width: 100%;
126
+ max-height: 150px;
127
+ object-fit: contain;
128
+ }
129
+
130
+ .preview-container .placeholder {
131
+ color: #999;
132
+ font-size: 3em;
133
+ }
134
+
135
+ .delete-btn {
136
+ position: absolute;
137
+ top: 5px;
138
+ left: 5px;
139
+ background: #f44336;
140
+ color: white;
141
+ border: none;
142
+ padding: 8px 12px;
143
+ border-radius: 5px;
144
+ cursor: pointer;
145
+ font-size: 0.8em;
146
+ opacity: 0;
147
+ transition: opacity 0.3s;
148
+ }
149
+
150
+ .preview-container:hover .delete-btn {
151
+ opacity: 1;
152
+ }
153
+
154
+ .delete-btn:hover {
155
+ background: #d32f2f;
156
+ }
157
+
158
+ .status-message {
159
+ padding: 15px;
160
+ border-radius: 10px;
161
+ margin-bottom: 20px;
162
+ display: none;
163
+ text-align: center;
164
+ font-weight: bold;
165
+ }
166
+
167
+ .status-message.success {
168
+ background: #d4edda;
169
+ color: #155724;
170
+ border: 1px solid #c3e6cb;
171
+ display: block;
172
+ }
173
+
174
+ .status-message.error {
175
+ background: #f8d7da;
176
+ color: #721c24;
177
+ border: 1px solid #f5c6cb;
178
+ display: block;
179
+ }
180
+
181
+ .action-buttons {
182
+ display: flex;
183
+ gap: 20px;
184
+ justify-content: center;
185
+ margin-top: 40px;
186
+ }
187
+
188
+ .btn {
189
+ padding: 15px 40px;
190
+ border: none;
191
+ border-radius: 10px;
192
+ font-size: 1.1em;
193
+ cursor: pointer;
194
+ transition: all 0.3s;
195
+ font-weight: bold;
196
+ text-decoration: none;
197
+ display: inline-block;
198
+ }
199
+
200
+ .btn-primary {
201
+ background: #ff1744;
202
+ color: white;
203
+ }
204
+
205
+ .btn-primary:hover {
206
+ background: #d81b60;
207
+ transform: translateY(-2px);
208
+ box-shadow: 0 5px 15px rgba(255, 23, 68, 0.4);
209
+ }
210
+
211
+ .btn-secondary {
212
+ background: #6c757d;
213
+ color: white;
214
+ }
215
+
216
+ .btn-secondary:hover {
217
+ background: #5a6268;
218
+ transform: translateY(-2px);
219
+ }
220
+
221
+ .gallery {
222
+ margin-top: 40px;
223
+ padding-top: 40px;
224
+ border-top: 2px solid #eee;
225
+ }
226
+
227
+ .gallery h2 {
228
+ color: #ff1744;
229
+ margin-bottom: 20px;
230
+ text-align: center;
231
+ }
232
+
233
+ .gallery-grid {
234
+ display: grid;
235
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
236
+ gap: 15px;
237
+ }
238
+
239
+ .gallery-item {
240
+ position: relative;
241
+ aspect-ratio: 1;
242
+ border-radius: 10px;
243
+ overflow: hidden;
244
+ background: #f8f9fa;
245
+ cursor: pointer;
246
+ transition: transform 0.3s;
247
+ }
248
+
249
+ .gallery-item:hover {
250
+ transform: scale(1.05);
251
+ }
252
+
253
+ .gallery-item img {
254
+ width: 100%;
255
+ height: 100%;
256
+ object-fit: cover;
257
+ }
258
+
259
+ .gallery-item .delete-gallery-btn {
260
+ position: absolute;
261
+ top: 5px;
262
+ left: 5px;
263
+ background: rgba(244, 67, 54, 0.9);
264
+ color: white;
265
+ border: none;
266
+ padding: 5px 10px;
267
+ border-radius: 5px;
268
+ cursor: pointer;
269
+ font-size: 0.8em;
270
+ opacity: 0;
271
+ transition: opacity 0.3s;
272
+ }
273
+
274
+ .gallery-item:hover .delete-gallery-btn {
275
+ opacity: 1;
276
+ }
277
+
278
+ .loading {
279
+ display: none;
280
+ text-align: center;
281
+ margin: 20px 0;
282
+ }
283
+
284
+ .loading.show {
285
+ display: block;
286
+ }
287
+
288
+ .spinner {
289
+ border: 4px solid #f3f3f3;
290
+ border-top: 4px solid #ff1744;
291
+ border-radius: 50%;
292
+ width: 40px;
293
+ height: 40px;
294
+ animation: spin 1s linear infinite;
295
+ margin: 0 auto;
296
+ }
297
+
298
+ @keyframes spin {
299
+ 0% { transform: rotate(0deg); }
300
+ 100% { transform: rotate(360deg); }
301
+ }
302
+
303
+ .instructions {
304
+ background: #fff3cd;
305
+ border: 1px solid #ffc107;
306
+ border-radius: 10px;
307
+ padding: 20px;
308
+ margin-bottom: 30px;
309
+ }
310
+
311
+ .instructions h3 {
312
+ color: #856404;
313
+ margin-bottom: 10px;
314
+ }
315
+
316
+ .instructions ul {
317
+ color: #856404;
318
+ margin-right: 20px;
319
+ }
320
+
321
+ .instructions li {
322
+ margin-bottom: 8px;
323
+ }
324
+ </style>
325
+ </head>
326
+ <body>
327
+ <div class="container">
328
+ <h1>🎨 لوحة تحكم التصميم</h1>
329
+ <p class="subtitle">ارفع الصور المفضلة لديك لتخصيص صفحة Valentine</p>
330
+
331
+ <div class="instructions">
332
+ <h3>📋 إرشادات الاستخدام:</h3>
333
+ <ul>
334
+ <li><strong>ستيتش:</strong> صورة ستيتش اللي هتظهر على اليسار</li>
335
+ <li><strong>أنجيلا:</strong> صورة أنجيلا اللي هتظهر على اليمين</li>
336
+ <li><strong>ستيكر 1:</strong> ستيكر في الركن الأيمن العلوي</li>
337
+ <li><strong>ستيكر 2:</strong> ستيكر في الركن الأيسر السفلي</li>
338
+ <li><strong>خلفية:</strong> صورة خلفية للصفحة كاملة</li>
339
+ <li><strong>🎵 موسيقى:</strong> ملف صوتي يشتغل في الخلفية (MP3, WAV, OGG)</li>
340
+ <li>⚠️ الصور المدعومة: PNG, JPG, GIF, WEBP (حد أقصى 16MB)</li>
341
+ <li>⚠️ الصوتيات المدعومة: MP3, WAV, OGG (حد أقصى 16MB)</li>
342
+ <li>💡 للحصول على أفضل نتيجة، استخدم صور بخلفية شفافة (PNG)</li>
343
+ <li>🎼 يمكنك استخدام موسيقى رومانسية هادئة من مكتبتك</li>
344
+ </ul>
345
+ </div>
346
+
347
+ <div id="statusMessage" class="status-message"></div>
348
+
349
+ <div class="loading" id="loading">
350
+ <div class="spinner"></div>
351
+ <p>جاري الرفع...</p>
352
+ </div>
353
+
354
+ <div class="upload-sections">
355
+ <!-- Stitch Upload -->
356
+ <div class="upload-card">
357
+ <h3>💙 ستيتش</h3>
358
+ <p>صورة ستيتش (الشخصية على اليسار)</p>
359
+ <div class="file-input-wrapper">
360
+ <input type="file" id="stitchInput" accept="image/*" onchange="uploadImage('stitch', this)">
361
+ <label for="stitchInput" class="file-input-label">
362
+ 📤 اختر صورة ستيتش
363
+ </label>
364
+ </div>
365
+ <div class="preview-container" id="stitchPreview">
366
+ <span class="placeholder">💙</span>
367
+ </div>
368
+ </div>
369
+
370
+ <!-- Angela Upload -->
371
+ <div class="upload-card">
372
+ <h3>🐱 أنجيلا</h3>
373
+ <p>صورة أنجيلا (الشخصية على اليمين)</p>
374
+ <div class="file-input-wrapper">
375
+ <input type="file" id="angelaInput" accept="image/*" onchange="uploadImage('angela', this)">
376
+ <label for="angelaInput" class="file-input-label">
377
+ 📤 اختر صورة أنجيلا
378
+ </label>
379
+ </div>
380
+ <div class="preview-container" id="angelaPreview">
381
+ <span class="placeholder">🐱</span>
382
+ </div>
383
+ </div>
384
+
385
+ <!-- Sticker 1 Upload -->
386
+ <div class="upload-card">
387
+ <h3>⭐ ستيكر 1</h3>
388
+ <p>ستيكر للركن الأيمن العلوي</p>
389
+ <div class="file-input-wrapper">
390
+ <input type="file" id="sticker1Input" accept="image/*" onchange="uploadImage('sticker1', this)">
391
+ <label for="sticker1Input" class="file-input-label">
392
+ 📤 اختر ستيكر 1
393
+ </label>
394
+ </div>
395
+ <div class="preview-container" id="sticker1Preview">
396
+ <span class="placeholder">⭐</span>
397
+ </div>
398
+ </div>
399
+
400
+ <!-- Sticker 2 Upload -->
401
+ <div class="upload-card">
402
+ <h3>✨ ستيكر 2</h3>
403
+ <p>ستيكر للركن الأيسر السفلي</p>
404
+ <div class="file-input-wrapper">
405
+ <input type="file" id="sticker2Input" accept="image/*" onchange="uploadImage('sticker2', this)">
406
+ <label for="sticker2Input" class="file-input-label">
407
+ 📤 اختر ستيكر 2
408
+ </label>
409
+ </div>
410
+ <div class="preview-container" id="sticker2Preview">
411
+ <span class="placeholder">✨</span>
412
+ </div>
413
+ </div>
414
+
415
+ <!-- Background Upload -->
416
+ <div class="upload-card">
417
+ <h3>🎨 خلفية الصفحة</h3>
418
+ <p>صورة خلفية للصفحة كاملة</p>
419
+ <div class="file-input-wrapper">
420
+ <input type="file" id="backgroundInput" accept="image/*" onchange="uploadImage('background', this)">
421
+ <label for="backgroundInput" class="file-input-label">
422
+ 📤 اختر صورة خلفية
423
+ </label>
424
+ </div>
425
+ <div class="preview-container" id="backgroundPreview">
426
+ <span class="placeholder">🎨</span>
427
+ </div>
428
+ </div>
429
+
430
+ <!-- Music Upload -->
431
+ <div class="upload-card">
432
+ <h3>🎵 موسيقى الخلفية</h3>
433
+ <p>ملف صوتي للموسيقى (MP3, WAV, OGG)</p>
434
+ <div class="file-input-wrapper">
435
+ <input type="file" id="musicInput" accept="audio/*" onchange="uploadMusic(this)">
436
+ <label for="musicInput" class="file-input-label">
437
+ 📤 اختر ملف موسيقى
438
+ </label>
439
+ </div>
440
+ <div class="preview-container" id="musicPreview">
441
+ <span class="placeholder">🎵</span>
442
+ </div>
443
+ </div>
444
+ </div>
445
+
446
+ <div class="action-buttons">
447
+ <a href="/" class="btn btn-primary">👀 معاينة الصفحة</a>
448
+ <button onclick="resetAll()" class="btn btn-secondary">🔄 إعادة تعيين الكل</button>
449
+ </div>
450
+
451
+ {% if images %}
452
+ <div class="gallery">
453
+ <h2>📸 معرض الصور المرفوعة</h2>
454
+ <div class="gallery-grid">
455
+ {% for image in images %}
456
+ <div class="gallery-item">
457
+ <img src="/uploads/{{ image }}" alt="{{ image }}">
458
+ <button class="delete-gallery-btn" onclick="deleteImage('{{ image }}')">🗑️</button>
459
+ </div>
460
+ {% endfor %}
461
+ </div>
462
+ </div>
463
+ {% endif %}
464
+ </div>
465
+
466
+ <script>
467
+ function showMessage(message, type) {
468
+ const msgEl = document.getElementById('statusMessage');
469
+ msgEl.textContent = message;
470
+ msgEl.className = `status-message ${type}`;
471
+ setTimeout(() => {
472
+ msgEl.className = 'status-message';
473
+ }, 5000);
474
+ }
475
+
476
+ function showLoading(show) {
477
+ const loadingEl = document.getElementById('loading');
478
+ loadingEl.className = show ? 'loading show' : 'loading';
479
+ }
480
+
481
+ async function uploadImage(type, input) {
482
+ const file = input.files[0];
483
+ if (!file) return;
484
+
485
+ // معاينة الصورة
486
+ const reader = new FileReader();
487
+ reader.onload = function(e) {
488
+ const preview = document.getElementById(`${type}Preview`);
489
+ preview.innerHTML = `
490
+ <img src="${e.target.result}" alt="${type}">
491
+ <button class="delete-btn" onclick="deleteImage('${type}')">🗑️ حذف</button>
492
+ `;
493
+ };
494
+ reader.readAsDataURL(file);
495
+
496
+ // رفع الصورة
497
+ const formData = new FormData();
498
+ formData.append('file', file);
499
+ formData.append('image_type', type);
500
+
501
+ showLoading(true);
502
+
503
+ try {
504
+ const response = await fetch('/upload', {
505
+ method: 'POST',
506
+ body: formData
507
+ });
508
+
509
+ const result = await response.json();
510
+
511
+ if (result.success) {
512
+ showMessage(`✅ ${result.message}`, 'success');
513
+ } else {
514
+ showMessage(`❌ ${result.error}`, 'error');
515
+ }
516
+ } catch (error) {
517
+ showMessage('❌ حدث خطأ أثناء رفع الصورة', 'error');
518
+ console.error('Upload error:', error);
519
+ } finally {
520
+ showLoading(false);
521
+ }
522
+ }
523
+
524
+ async function uploadMusic(input) {
525
+ const file = input.files[0];
526
+ if (!file) return;
527
+
528
+ // التحقق من نوع الملف
529
+ const validTypes = ['audio/mpeg', 'audio/mp3', 'audio/wav', 'audio/ogg'];
530
+ if (!validTypes.includes(file.type) && !file.name.match(/\.(mp3|wav|ogg)$/i)) {
531
+ showMessage('❌ يرجى اختيار ملف صوتي (MP3, WAV, OGG)', 'error');
532
+ return;
533
+ }
534
+
535
+ // معاينة اسم الملف
536
+ const preview = document.getElementById('musicPreview');
537
+ preview.innerHTML = `
538
+ <div style="padding: 20px; text-align: center;">
539
+ <div style="font-size: 3em; margin-bottom: 10px;">🎵</div>
540
+ <div style="font-size: 0.9em; color: #666;">${file.name}</div>
541
+ <audio controls style="width: 100%; margin-top: 10px;">
542
+ <source src="${URL.createObjectURL(file)}" type="${file.type}">
543
+ </audio>
544
+ </div>
545
+ <button class="delete-btn" onclick="deleteImage('music')">🗑️ حذف</button>
546
+ `;
547
+
548
+ // رفع الملف
549
+ const formData = new FormData();
550
+ formData.append('file', file);
551
+ formData.append('image_type', 'music');
552
+
553
+ showLoading(true);
554
+
555
+ try {
556
+ const response = await fetch('/upload', {
557
+ method: 'POST',
558
+ body: formData
559
+ });
560
+
561
+ const result = await response.json();
562
+
563
+ if (result.success) {
564
+ showMessage('✅ تم رفع الموسيقى بنجاح! 🎵', 'success');
565
+ } else {
566
+ showMessage(`❌ ${result.error}`, 'error');
567
+ }
568
+ } catch (error) {
569
+ showMessage('❌ حدث خطأ أثناء رفع الموسيقى', 'error');
570
+ console.error('Upload error:', error);
571
+ } finally {
572
+ showLoading(false);
573
+ }
574
+ }
575
+
576
+ async function deleteImage(filename) {
577
+ if (!confirm('هل أنت متأكد من حذف هذه الصورة؟')) {
578
+ return;
579
+ }
580
+
581
+ showLoading(true);
582
+
583
+ try {
584
+ const response = await fetch(`/delete/${filename}`, {
585
+ method: 'POST'
586
+ });
587
+
588
+ const result = await response.json();
589
+
590
+ if (result.success) {
591
+ showMessage('✅ تم حذف الصورة بنجاح', 'success');
592
+ // إعادة تحميل الصفحة بعد ثانية
593
+ setTimeout(() => location.reload(), 1000);
594
+ } else {
595
+ showMessage(`❌ ${result.error}`, 'error');
596
+ }
597
+ } catch (error) {
598
+ showMessage('❌ حدث خطأ أثناء حذف الصورة', 'error');
599
+ console.error('Delete error:', error);
600
+ } finally {
601
+ showLoading(false);
602
+ }
603
+ }
604
+
605
+ function resetAll() {
606
+ if (!confirm('هل أنت متأكد من حذف جميع الصور؟')) {
607
+ return;
608
+ }
609
+
610
+ // هنا يمكن إضافة endpoint لحذف كل الصور
611
+ showMessage('⚠️ هذه الميزة قيد التطوير', 'error');
612
+ }
613
+
614
+ // تحميل الصور الموجودة عند فتح الصفحة
615
+ async function loadExistingImages() {
616
+ try {
617
+ const response = await fetch('/get-images');
618
+ const images = await response.json();
619
+
620
+ // عرض الصور الموجودة في المعاينة
621
+ Object.entries(images).forEach(([type, filename]) => {
622
+ const preview = document.getElementById(`${type}Preview`);
623
+ if (preview) {
624
+ preview.innerHTML = `
625
+ <img src="/uploads/${filename}" alt="${type}">
626
+ <button class="delete-btn" onclick="deleteImage('${filename}')">🗑️ حذف</button>
627
+ `;
628
+ }
629
+ });
630
+ } catch (error) {
631
+ console.log('No existing images found');
632
+ }
633
+ }
634
+
635
+ // تحميل الصور عند فتح الصفحة
636
+ window.onload = loadExistingImages;
637
+ </script>
638
+ </body>
639
+ </html>
app.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, request, redirect, url_for, jsonify, send_from_directory
2
+ import os
3
+ from werkzeug.utils import secure_filename
4
+ import json
5
+
6
+ app = Flask(__name__)
7
+ app.config['UPLOAD_FOLDER'] = 'uploads'
8
+ app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB max file size
9
+ app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
10
+ app.config['ALLOWED_AUDIO'] = {'mp3', 'wav', 'ogg', 'mpeg'}
11
+
12
+ # إنشاء مجلد uploads إذا لم يكن موجوداً
13
+ os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
14
+
15
+ def allowed_file(filename):
16
+ return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']
17
+
18
+ def allowed_audio(filename):
19
+ return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_AUDIO']
20
+
21
+ @app.route('/')
22
+ def index():
23
+ """الصفحة الرئيسية - Valentine Question"""
24
+ return render_template('valentine.html')
25
+
26
+ @app.route('/admin')
27
+ def admin():
28
+ """صفحة الأدمن لرفع الصور"""
29
+ images = []
30
+ if os.path.exists(app.config['UPLOAD_FOLDER']):
31
+ images = [f for f in os.listdir(app.config['UPLOAD_FOLDER'])
32
+ if allowed_file(f)]
33
+ return render_template('admin.html', images=images)
34
+
35
+ @app.route('/upload', methods=['POST'])
36
+ def upload_file():
37
+ """رفع الصور والملفات الصوتية"""
38
+ if 'file' not in request.files:
39
+ return jsonify({'error': 'لا يوجد ملف'}), 400
40
+
41
+ file = request.files['file']
42
+ image_type = request.form.get('image_type', 'other')
43
+
44
+ if file.filename == '':
45
+ return jsonify({'error': 'لم يتم اختيار ملف'}), 400
46
+
47
+ # التحقق من نوع الملف
48
+ is_audio = image_type == 'music'
49
+
50
+ if is_audio and allowed_audio(file.filename):
51
+ ext = file.filename.rsplit('.', 1)[1].lower()
52
+ filename = f"music.{ext}"
53
+ filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
54
+ file.save(filepath)
55
+
56
+ return jsonify({
57
+ 'success': True,
58
+ 'filename': filename,
59
+ 'message': 'تم رفع الموسيقى بنجاح!'
60
+ })
61
+ elif not is_audio and allowed_file(file.filename):
62
+ # حفظ الملف باسم يعتمد على نوعه
63
+ ext = file.filename.rsplit('.', 1)[1].lower()
64
+ if image_type in ['stitch', 'angela', 'sticker1', 'sticker2', 'background']:
65
+ filename = f"{image_type}.{ext}"
66
+ else:
67
+ filename = secure_filename(file.filename)
68
+
69
+ filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
70
+ file.save(filepath)
71
+
72
+ return jsonify({
73
+ 'success': True,
74
+ 'filename': filename,
75
+ 'message': 'تم رفع الصورة بنجاح!'
76
+ })
77
+
78
+ return jsonify({'error': 'نوع ملف غير مسموح'}), 400
79
+
80
+ @app.route('/uploads/<filename>')
81
+ def uploaded_file(filename):
82
+ """عرض الصور المرفوعة"""
83
+ return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
84
+
85
+ @app.route('/delete/<filename>', methods=['POST'])
86
+ def delete_file(filename):
87
+ """حذف صورة"""
88
+ try:
89
+ filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
90
+ if os.path.exists(filepath):
91
+ os.remove(filepath)
92
+ return jsonify({'success': True, 'message': 'تم الحذف بنجاح'})
93
+ return jsonify({'error': 'الملف غير موجود'}), 404
94
+ except Exception as e:
95
+ return jsonify({'error': str(e)}), 500
96
+
97
+ @app.route('/get-images')
98
+ def get_images():
99
+ """الحصول على قائمة الصور المتاحة"""
100
+ images = {}
101
+ if os.path.exists(app.config['UPLOAD_FOLDER']):
102
+ for image_type in ['stitch', 'angela', 'sticker1', 'sticker2', 'background']:
103
+ for ext in ['png', 'jpg', 'jpeg', 'gif', 'webp']:
104
+ filename = f"{image_type}.{ext}"
105
+ if os.path.exists(os.path.join(app.config['UPLOAD_FOLDER'], filename)):
106
+ images[image_type] = filename
107
+ break
108
+ return jsonify(images)
109
+
110
+ @app.route('/get-music')
111
+ def get_music():
112
+ """الحصول على ملف الموسيقى المتاح"""
113
+ music_data = {}
114
+ if os.path.exists(app.config['UPLOAD_FOLDER']):
115
+ for ext in ['mp3', 'wav', 'ogg']:
116
+ filename = f"music.{ext}"
117
+ if os.path.exists(os.path.join(app.config['UPLOAD_FOLDER'], filename)):
118
+ music_data['music_file'] = filename
119
+ break
120
+ return jsonify(music_data)
121
+
122
+ if __name__ == '__main__':
123
+ app.run(debug=False, host='0.0.0.0', port=7860)
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ Flask
2
+ Werkzeug
valentine.html ADDED
@@ -0,0 +1,826 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ar" dir="rtl">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Be My Valentine 💖</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ body {
15
+ font-family: 'Arial', sans-serif;
16
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
17
+ min-height: 100vh;
18
+ display: flex;
19
+ justify-content: center;
20
+ align-items: center;
21
+ overflow: hidden;
22
+ position: relative;
23
+ }
24
+
25
+ /* خلفية مخصصة إذا تم رفعها */
26
+ body.custom-bg {
27
+ background-image: var(--bg-image);
28
+ background-size: cover;
29
+ background-position: center;
30
+ }
31
+
32
+ body.custom-bg::before {
33
+ content: '';
34
+ position: absolute;
35
+ top: 0;
36
+ left: 0;
37
+ width: 100%;
38
+ height: 100%;
39
+ background: rgba(0, 0, 0, 0.3);
40
+ z-index: 0;
41
+ }
42
+
43
+ .container {
44
+ text-align: center;
45
+ background: white;
46
+ padding: 50px;
47
+ border-radius: 30px;
48
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
49
+ max-width: 600px;
50
+ position: relative;
51
+ z-index: 1;
52
+ }
53
+
54
+ h1 {
55
+ font-size: 2.5em;
56
+ margin-bottom: 30px;
57
+ color: #ff1744;
58
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
59
+ }
60
+
61
+ .valentine-text {
62
+ color: #e91e63;
63
+ }
64
+
65
+ /* أنيميشن الشخصيات */
66
+ .characters-container {
67
+ display: flex;
68
+ justify-content: center;
69
+ align-items: flex-end;
70
+ gap: 20px;
71
+ margin: 30px 0;
72
+ min-height: 250px;
73
+ position: relative;
74
+ }
75
+
76
+ .character {
77
+ position: relative;
78
+ animation: bounce 2s ease-in-out infinite;
79
+ }
80
+
81
+ .character img {
82
+ width: 180px;
83
+ height: 180px;
84
+ object-fit: contain;
85
+ filter: drop-shadow(0 5px 15px rgba(0, 0, 0, 0.2));
86
+ }
87
+
88
+ /* ستيتش على اليسار */
89
+ .stitch {
90
+ animation-delay: 0s;
91
+ }
92
+
93
+ /* أنجيلا على اليمين */
94
+ .angela {
95
+ animation-delay: 1s;
96
+ }
97
+
98
+ @keyframes bounce {
99
+ 0%, 100% {
100
+ transform: translateY(0) scale(1);
101
+ }
102
+ 50% {
103
+ transform: translateY(-20px) scale(1.05);
104
+ }
105
+ }
106
+
107
+ /* قلب بين الشخصيتين */
108
+ .heart-between {
109
+ position: absolute;
110
+ top: 30%;
111
+ left: 50%;
112
+ transform: translate(-50%, -50%);
113
+ font-size: 50px;
114
+ animation: pulse 1.5s ease-in-out infinite;
115
+ z-index: 10;
116
+ }
117
+
118
+ @keyframes pulse {
119
+ 0%, 100% {
120
+ transform: translate(-50%, -50%) scale(1);
121
+ opacity: 1;
122
+ }
123
+ 50% {
124
+ transform: translate(-50%, -50%) scale(1.3);
125
+ opacity: 0.8;
126
+ }
127
+ }
128
+
129
+ /* ستيكرز في الزوايا */
130
+ .sticker {
131
+ position: absolute;
132
+ width: 100px;
133
+ height: 100px;
134
+ object-fit: contain;
135
+ animation: rotate-float 6s ease-in-out infinite;
136
+ z-index: 2;
137
+ }
138
+
139
+ .sticker1 {
140
+ top: -30px;
141
+ right: -30px;
142
+ }
143
+
144
+ .sticker2 {
145
+ bottom: -30px;
146
+ left: -30px;
147
+ animation-delay: 3s;
148
+ }
149
+
150
+ @keyframes rotate-float {
151
+ 0%, 100% {
152
+ transform: rotate(0deg) translateY(0);
153
+ }
154
+ 25% {
155
+ transform: rotate(10deg) translateY(-10px);
156
+ }
157
+ 50% {
158
+ transform: rotate(-10deg) translateY(-5px);
159
+ }
160
+ 75% {
161
+ transform: rotate(5deg) translateY(-15px);
162
+ }
163
+ }
164
+
165
+ .question {
166
+ font-size: 1.8em;
167
+ color: #f44336;
168
+ margin: 30px 0;
169
+ font-weight: bold;
170
+ }
171
+
172
+ .buttons {
173
+ display: flex;
174
+ gap: 20px;
175
+ justify-content: center;
176
+ align-items: center;
177
+ margin-top: 30px;
178
+ flex-wrap: wrap;
179
+ position: relative;
180
+ min-height: 80px;
181
+ }
182
+
183
+ .yes-button {
184
+ background: #ff1744;
185
+ color: white;
186
+ border: none;
187
+ padding: 20px 60px;
188
+ font-size: 2em;
189
+ border-radius: 15px;
190
+ cursor: pointer;
191
+ transition: all 0.3s ease;
192
+ font-weight: bold;
193
+ box-shadow: 0 5px 15px rgba(255, 23, 68, 0.4);
194
+ }
195
+
196
+ .yes-button:hover {
197
+ background: #d81b60;
198
+ transform: scale(1.1);
199
+ box-shadow: 0 8px 25px rgba(255, 23, 68, 0.6);
200
+ }
201
+
202
+ .yes-button:active {
203
+ transform: scale(1.05);
204
+ }
205
+
206
+ .no-button {
207
+ background: #9e9e9e;
208
+ color: white;
209
+ border: none;
210
+ padding: 8px 20px;
211
+ font-size: 0.9em;
212
+ border-radius: 10px;
213
+ cursor: pointer;
214
+ position: absolute;
215
+ transition: all 0.2s ease;
216
+ white-space: nowrap;
217
+ }
218
+
219
+ .no-button:hover {
220
+ background: #757575;
221
+ }
222
+
223
+ .hearts {
224
+ position: fixed;
225
+ top: -10%;
226
+ width: 100%;
227
+ height: 100%;
228
+ pointer-events: none;
229
+ z-index: 9999;
230
+ }
231
+
232
+ .heart {
233
+ position: absolute;
234
+ font-size: 30px;
235
+ animation: fall linear infinite;
236
+ opacity: 0;
237
+ }
238
+
239
+ @keyframes fall {
240
+ 0% {
241
+ opacity: 1;
242
+ top: -10%;
243
+ transform: translateX(0);
244
+ }
245
+ 100% {
246
+ opacity: 0;
247
+ top: 110%;
248
+ transform: translateX(50px);
249
+ }
250
+ }
251
+
252
+ .success-message {
253
+ display: none;
254
+ position: fixed;
255
+ top: 50%;
256
+ left: 50%;
257
+ transform: translate(-50%, -50%) scale(0);
258
+ background: white;
259
+ padding: 60px;
260
+ border-radius: 30px;
261
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
262
+ z-index: 10000;
263
+ text-align: center;
264
+ transition: transform 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
265
+ }
266
+
267
+ .success-message.show {
268
+ display: block;
269
+ transform: translate(-50%, -50%) scale(1);
270
+ }
271
+
272
+ .success-message h2 {
273
+ font-size: 3em;
274
+ color: #ff1744;
275
+ margin-bottom: 20px;
276
+ }
277
+
278
+ .success-message p {
279
+ font-size: 1.5em;
280
+ color: #666;
281
+ }
282
+
283
+ .emoji {
284
+ font-size: 4em;
285
+ animation: spin-pulse 2s ease-in-out infinite;
286
+ }
287
+
288
+ @keyframes spin-pulse {
289
+ 0%, 100% {
290
+ transform: scale(1) rotate(0deg);
291
+ }
292
+ 25% {
293
+ transform: scale(1.2) rotate(-10deg);
294
+ }
295
+ 75% {
296
+ transform: scale(1.2) rotate(10deg);
297
+ }
298
+ }
299
+
300
+ /* Sparkles effect */
301
+ .sparkle {
302
+ position: absolute;
303
+ width: 5px;
304
+ height: 5px;
305
+ background: #ffd700;
306
+ border-radius: 50%;
307
+ pointer-events: none;
308
+ animation: sparkle-animation 1s ease-out forwards;
309
+ }
310
+
311
+ @keyframes sparkle-animation {
312
+ 0% {
313
+ opacity: 1;
314
+ transform: translate(0, 0) scale(0);
315
+ }
316
+ 100% {
317
+ opacity: 0;
318
+ transform: translate(var(--tx), var(--ty)) scale(1);
319
+ }
320
+ }
321
+
322
+ /* Admin link */
323
+ .admin-link {
324
+ position: fixed;
325
+ bottom: 20px;
326
+ left: 20px;
327
+ background: rgba(255, 255, 255, 0.9);
328
+ padding: 10px 20px;
329
+ border-radius: 10px;
330
+ text-decoration: none;
331
+ color: #666;
332
+ font-size: 14px;
333
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
334
+ transition: all 0.3s;
335
+ z-index: 100;
336
+ }
337
+
338
+ .admin-link:hover {
339
+ background: white;
340
+ transform: translateY(-2px);
341
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
342
+ }
343
+
344
+ /* Music Control Button */
345
+ .music-control {
346
+ position: fixed;
347
+ bottom: 20px;
348
+ right: 20px;
349
+ background: rgba(255, 255, 255, 0.9);
350
+ border: none;
351
+ width: 60px;
352
+ height: 60px;
353
+ border-radius: 50%;
354
+ cursor: pointer;
355
+ font-size: 24px;
356
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
357
+ transition: all 0.3s;
358
+ z-index: 100;
359
+ display: flex;
360
+ align-items: center;
361
+ justify-content: center;
362
+ }
363
+
364
+ .music-control:hover {
365
+ background: white;
366
+ transform: scale(1.1);
367
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
368
+ }
369
+
370
+ .music-control:active {
371
+ transform: scale(0.95);
372
+ }
373
+
374
+ .music-control.playing {
375
+ background: linear-gradient(135deg, #ff1744 0%, #e91e63 100%);
376
+ color: white;
377
+ animation: music-pulse 2s ease-in-out infinite;
378
+ }
379
+
380
+ @keyframes music-pulse {
381
+ 0%, 100% {
382
+ box-shadow: 0 4px 15px rgba(255, 23, 68, 0.4);
383
+ }
384
+ 50% {
385
+ box-shadow: 0 4px 25px rgba(255, 23, 68, 0.8);
386
+ }
387
+ }
388
+ </style>
389
+ </head>
390
+ <body>
391
+ <div class="hearts" id="hearts"></div>
392
+
393
+ <div class="container">
394
+ <!-- ستيكرز الزوايا -->
395
+ <img id="sticker1" class="sticker sticker1" style="display: none;">
396
+ <img id="sticker2" class="sticker sticker2" style="display: none;">
397
+
398
+ <h1>Be My <span class="valentine-text">Valentine</span> 💖</h1>
399
+
400
+ <!-- الشخصيات مع أنيميشن -->
401
+ <div class="characters-container">
402
+ <div class="character stitch">
403
+ <img id="stitchImg" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Ctext x='50%25' y='50%25' font-size='120' text-anchor='middle' dominant-baseline='middle'%3E💙%3C/text%3E%3C/svg%3E" alt="Stitch">
404
+ </div>
405
+
406
+ <div class="heart-between">💕</div>
407
+
408
+ <div class="character angela">
409
+ <img id="angelaImg" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Ctext x='50%25' y='50%25' font-size='120' text-anchor='middle' dominant-baseline='middle'%3E🐱%3C/text%3E%3C/svg%3E" alt="Angela">
410
+ </div>
411
+ </div>
412
+
413
+ <p class="question">Will you be my Valentine?</p>
414
+
415
+ <div class="buttons">
416
+ <button class="yes-button" onclick="handleYesClick()">Yes 💖</button>
417
+ <button class="no-button" id="noButton" onmouseover="moveButton()" onclick="moveButton()">Pookie please...</button>
418
+ </div>
419
+ </div>
420
+
421
+ <div class="success-message" id="successMessage">
422
+ <div class="emoji">💕</div>
423
+ <h2>يااااي! 🎉</h2>
424
+ <p>I knew you'd say yes! 💖</p>
425
+ <div class="emoji">😍</div>
426
+ </div>
427
+
428
+ <a href="/admin" class="admin-link">⚙️ تخصيص الصور</a>
429
+
430
+ <!-- Audio Player -->
431
+ <audio id="bgMusic" loop>
432
+ <source id="musicSource" src="" type="audio/mpeg">
433
+ </audio>
434
+
435
+ <!-- Music Control Button -->
436
+ <button class="music-control" id="musicControl" onclick="toggleMusic()">
437
+ <span id="musicIcon">🔇</span>
438
+ </button>
439
+
440
+ <script>
441
+ let messageIndex = 0;
442
+ const messages = [
443
+ "Pookie please... 🥺",
444
+ "Are you sure? 💔",
445
+ "Please say yes! 🙏",
446
+ "Don't break my heart 😢",
447
+ "Just click Yes! 💕",
448
+ "Come on! 😭",
449
+ "Pretty please? 🥹",
450
+ "I'll be sad... 💔",
451
+ "Think again! 🤔",
452
+ "Last chance! 💖"
453
+ ];
454
+
455
+ let musicPlaying = false;
456
+ const bgMusic = document.getElementById('bgMusic');
457
+ const musicControl = document.getElementById('musicControl');
458
+ const musicIcon = document.getElementById('musicIcon');
459
+
460
+ // Music Control Functions
461
+ function toggleMusic() {
462
+ if (musicPlaying) {
463
+ pauseMusic();
464
+ } else {
465
+ playMusic();
466
+ }
467
+ }
468
+
469
+ function playMusic() {
470
+ if (bgMusic.src && bgMusic.src !== window.location.href) {
471
+ // تشغيل الموسيقى المحملة
472
+ bgMusic.play().then(() => {
473
+ musicPlaying = true;
474
+ musicControl.classList.add('playing');
475
+ musicIcon.textContent = '🔊';
476
+ }).catch(err => {
477
+ console.log('Music play failed, using generated melody:', err);
478
+ playGeneratedMelody();
479
+ musicPlaying = true;
480
+ musicControl.classList.add('playing');
481
+ musicIcon.textContent = '🔊';
482
+ });
483
+ } else {
484
+ // استخدام الموسيقى المولدة
485
+ playGeneratedMelody();
486
+ musicPlaying = true;
487
+ musicControl.classList.add('playing');
488
+ musicIcon.textContent = '🔊';
489
+ }
490
+ }
491
+
492
+ function pauseMusic() {
493
+ if (bgMusic) {
494
+ bgMusic.pause();
495
+ }
496
+ stopGeneratedMelody();
497
+ musicPlaying = false;
498
+ musicControl.classList.remove('playing');
499
+ musicIcon.textContent = '🔇';
500
+ }
501
+
502
+ // Auto-play attempt (some browsers block this)
503
+ function attemptAutoPlay() {
504
+ // محاولة التشغيل التلقائي
505
+ const playPromise = bgMusic.play();
506
+
507
+ if (playPromise !== undefined) {
508
+ playPromise.then(() => {
509
+ musicPlaying = true;
510
+ musicControl.classList.add('playing');
511
+ musicIcon.textContent = '🔊';
512
+ }).catch(() => {
513
+ // الم��صفح منع التشغيل التلقائي
514
+ console.log('Auto-play blocked. User interaction required.');
515
+ });
516
+ }
517
+ }
518
+
519
+ // تحميل الموسيقى المخصصة إذا كانت موجودة
520
+ async function loadCustomMusic() {
521
+ try {
522
+ const response = await fetch('/get-music');
523
+ const data = await response.json();
524
+
525
+ if (data.music_file) {
526
+ document.getElementById('musicSource').src = `/uploads/${data.music_file}`;
527
+ bgMusic.load();
528
+ } else {
529
+ // استخدام موسيقى رومانسية افتراضية
530
+ loadDefaultMusic();
531
+ }
532
+ } catch (error) {
533
+ // استخدام موسيقى افتراضية
534
+ loadDefaultMusic();
535
+ }
536
+ }
537
+
538
+ // قائمة بموسيقى رومانسية مجانية
539
+ function loadDefaultMusic() {
540
+ const romanticMusic = [
541
+ // Pixabay - Romantic Piano
542
+ 'https://cdn.pixabay.com/audio/2022/03/10/audio_2c90ba57ce.mp3',
543
+ // Pixabay - Beautiful Love
544
+ 'https://cdn.pixabay.com/audio/2022/05/27/audio_1808fbf07a.mp3',
545
+ // Pixabay - Tender Love
546
+ 'https://cdn.pixabay.com/audio/2023/02/28/audio_bd3b3c6a8b.mp3',
547
+ // Pixabay - Romantic Music
548
+ 'https://cdn.pixabay.com/audio/2022/03/24/audio_c0b2ea6da7.mp3',
549
+ // Pixabay - Sweet Love
550
+ 'https://cdn.pixabay.com/audio/2022/10/25/audio_438a304e6e.mp3'
551
+ ];
552
+
553
+ // اختيار موسيقى عشوائية
554
+ const randomMusic = romanticMusic[Math.floor(Math.random() * romanticMusic.length)];
555
+ const musicSource = document.getElementById('musicSource');
556
+ musicSource.src = randomMusic;
557
+ bgMusic.load();
558
+
559
+ // محاولة تحميل بديل إذا فشل التحميل
560
+ bgMusic.onerror = function() {
561
+ console.log('Failed to load music, trying alternative...');
562
+ const currentIndex = romanticMusic.findIndex(url => url === musicSource.src);
563
+ if (currentIndex !== -1) {
564
+ const nextIndex = (currentIndex + 1) % romanticMusic.length;
565
+ if (nextIndex !== currentIndex) {
566
+ musicSource.src = romanticMusic[nextIndex];
567
+ bgMusic.load();
568
+ } else {
569
+ // إذا فشلت كل المحاولات، استخدم موسيقى مولدة
570
+ console.log('All external music failed, using generated melody');
571
+ playGeneratedMelody();
572
+ }
573
+ }
574
+ };
575
+ }
576
+
577
+ // توليد موسيقى رومانسية بسيطة باستخدام Web Audio API
578
+ let audioContext;
579
+ let isGeneratedMusicPlaying = false;
580
+
581
+ function playGeneratedMelody() {
582
+ if (!audioContext) {
583
+ audioContext = new (window.AudioContext || window.webkitAudioContext)();
584
+ }
585
+
586
+ if (isGeneratedMusicPlaying) return;
587
+ isGeneratedMusicPlaying = true;
588
+
589
+ // نوتات موسيقية رومانسية بسيطة (C Major Scale - لحن رومانسي)
590
+ const romanticMelody = [
591
+ { note: 523.25, duration: 0.5 }, // C5
592
+ { note: 587.33, duration: 0.5 }, // D5
593
+ { note: 659.25, duration: 0.5 }, // E5
594
+ { note: 698.46, duration: 0.5 }, // F5
595
+ { note: 783.99, duration: 1.0 }, // G5
596
+ { note: 659.25, duration: 0.5 }, // E5
597
+ { note: 587.33, duration: 0.5 }, // D5
598
+ { note: 523.25, duration: 1.0 }, // C5
599
+ { note: 587.33, duration: 0.5 }, // D5
600
+ { note: 659.25, duration: 0.5 }, // E5
601
+ { note: 698.46, duration: 1.0 }, // F5
602
+ { note: 659.25, duration: 0.5 }, // E5
603
+ { note: 587.33, duration: 1.5 }, // D5
604
+ ];
605
+
606
+ function playNote(frequency, duration, startTime) {
607
+ const oscillator = audioContext.createOscillator();
608
+ const gainNode = audioContext.createGain();
609
+
610
+ oscillator.connect(gainNode);
611
+ gainNode.connect(audioContext.destination);
612
+
613
+ oscillator.frequency.value = frequency;
614
+ oscillator.type = 'sine'; // نغمة ناعمة رومانسية
615
+
616
+ // Envelope للنغمة
617
+ gainNode.gain.setValueAtTime(0, startTime);
618
+ gainNode.gain.linearRampToValueAtTime(0.3, startTime + 0.05);
619
+ gainNode.gain.linearRampToValueAtTime(0.2, startTime + duration - 0.1);
620
+ gainNode.gain.linearRampToValueAtTime(0, startTime + duration);
621
+
622
+ oscillator.start(startTime);
623
+ oscillator.stop(startTime + duration);
624
+ }
625
+
626
+ function playMelody() {
627
+ let currentTime = audioContext.currentTime;
628
+
629
+ romanticMelody.forEach(({ note, duration }) => {
630
+ playNote(note, duration, currentTime);
631
+ currentTime += duration;
632
+ });
633
+
634
+ // إعادة تشغيل اللحن
635
+ if (isGeneratedMusicPlaying) {
636
+ setTimeout(playMelody, currentTime * 1000 - audioContext.currentTime * 1000);
637
+ }
638
+ }
639
+
640
+ playMelody();
641
+ }
642
+
643
+ function stopGeneratedMelody() {
644
+ isGeneratedMusicPlaying = false;
645
+ }
646
+
647
+ function moveButton() {
648
+ const button = document.getElementById('noButton');
649
+ const buttonsContainer = document.querySelector('.buttons');
650
+
651
+ // تغيير النص
652
+ messageIndex = (messageIndex + 1) % messages.length;
653
+ button.textContent = messages[messageIndex];
654
+
655
+ // تصغير الزرار
656
+ const currentSize = parseFloat(window.getComputedStyle(button).fontSize);
657
+ button.style.fontSize = `${Math.max(currentSize * 0.85, 8)}px`;
658
+ button.style.padding = `${Math.max(parseInt(button.style.padding || 8) * 0.9, 5)}px ${Math.max(parseInt(button.style.padding || 20) * 0.9, 10)}px`;
659
+
660
+ // تكبير زرار Yes
661
+ const yesButton = document.querySelector('.yes-button');
662
+ const yesCurrentSize = parseFloat(window.getComputedStyle(yesButton).fontSize);
663
+ yesButton.style.fontSize = `${yesCurrentSize * 1.1}px`;
664
+
665
+ // تحريك الزرار لمكان عشوائي
666
+ const containerRect = buttonsContainer.getBoundingClientRect();
667
+ const buttonRect = button.getBoundingClientRect();
668
+
669
+ const maxX = containerRect.width - buttonRect.width - 40;
670
+ const maxY = 100;
671
+
672
+ const randomX = Math.random() * maxX - maxX/2;
673
+ const randomY = Math.random() * maxY - 50;
674
+
675
+ button.style.transform = `translate(${randomX}px, ${randomY}px)`;
676
+
677
+ // إضافة تأثير sparkle
678
+ createSparkles(button);
679
+ }
680
+
681
+ function createSparkles(element) {
682
+ const rect = element.getBoundingClientRect();
683
+ for (let i = 0; i < 5; i++) {
684
+ const sparkle = document.createElement('div');
685
+ sparkle.className = 'sparkle';
686
+ sparkle.style.left = rect.left + rect.width/2 + 'px';
687
+ sparkle.style.top = rect.top + rect.height/2 + 'px';
688
+ sparkle.style.setProperty('--tx', `${(Math.random() - 0.5) * 100}px`);
689
+ sparkle.style.setProperty('--ty', `${(Math.random() - 0.5) * 100}px`);
690
+ document.body.appendChild(sparkle);
691
+ setTimeout(() => sparkle.remove(), 1000);
692
+ }
693
+ }
694
+
695
+ function handleYesClick() {
696
+ // إظهار رسالة النجاح
697
+ const successMsg = document.getElementById('successMessage');
698
+ successMsg.classList.add('show');
699
+
700
+ // إنشاء قلوب متساقطة
701
+ createHearts();
702
+
703
+ // تأثير confetti
704
+ createConfetti();
705
+
706
+ // تشغيل موسيقى احتفالية إضافية
707
+ playSuccessSound();
708
+ }
709
+
710
+ function playSuccessSound() {
711
+ // إنشاء صوت احتفالي
712
+ const successAudio = new Audio('https://cdn.pixabay.com/audio/2022/03/15/audio_c30f2c8b91.mp3');
713
+ successAudio.volume = 0.5;
714
+ successAudio.play().catch(err => console.log('Success sound play failed:', err));
715
+ }
716
+
717
+ function createHearts() {
718
+ const heartsContainer = document.getElementById('hearts');
719
+ const heartSymbols = ['❤️', '💕', '💖', '💗', '💓', '💝', '💘', '💞'];
720
+
721
+ for (let i = 0; i < 80; i++) {
722
+ setTimeout(() => {
723
+ const heart = document.createElement('div');
724
+ heart.className = 'heart';
725
+ heart.textContent = heartSymbols[Math.floor(Math.random() * heartSymbols.length)];
726
+ heart.style.left = Math.random() * 100 + '%';
727
+ heart.style.animationDuration = (Math.random() * 3 + 2) + 's';
728
+ heart.style.fontSize = (Math.random() * 30 + 20) + 'px';
729
+ heartsContainer.appendChild(heart);
730
+
731
+ setTimeout(() => heart.remove(), 5000);
732
+ }, i * 50);
733
+ }
734
+ }
735
+
736
+ function createConfetti() {
737
+ const colors = ['#ff1744', '#e91e63', '#9c27b0', '#ffd700', '#ff69b4'];
738
+ for (let i = 0; i < 100; i++) {
739
+ setTimeout(() => {
740
+ const confetti = document.createElement('div');
741
+ confetti.style.position = 'fixed';
742
+ confetti.style.width = '10px';
743
+ confetti.style.height = '10px';
744
+ confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
745
+ confetti.style.left = Math.random() * window.innerWidth + 'px';
746
+ confetti.style.top = '-20px';
747
+ confetti.style.borderRadius = Math.random() > 0.5 ? '50%' : '0';
748
+ confetti.style.zIndex = '10001';
749
+ confetti.style.pointerEvents = 'none';
750
+ document.body.appendChild(confetti);
751
+
752
+ const animation = confetti.animate([
753
+ { transform: 'translateY(0) rotate(0deg)', opacity: 1 },
754
+ { transform: `translateY(${window.innerHeight + 100}px) rotate(${Math.random() * 720}deg)`, opacity: 0 }
755
+ ], {
756
+ duration: Math.random() * 2000 + 2000,
757
+ easing: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)'
758
+ });
759
+
760
+ animation.onfinish = () => confetti.remove();
761
+ }, i * 30);
762
+ }
763
+ }
764
+
765
+ // تحميل الصور المخصصة
766
+ async function loadCustomImages() {
767
+ try {
768
+ const response = await fetch('/get-images');
769
+ const images = await response.json();
770
+
771
+ // تحميل صورة ستيتش
772
+ if (images.stitch) {
773
+ document.getElementById('stitchImg').src = `/uploads/${images.stitch}`;
774
+ }
775
+
776
+ // تحميل صورة أنجيلا
777
+ if (images.angela) {
778
+ document.getElementById('angelaImg').src = `/uploads/${images.angela}`;
779
+ }
780
+
781
+ // تحميل الستيكرز
782
+ if (images.sticker1) {
783
+ const sticker1 = document.getElementById('sticker1');
784
+ sticker1.src = `/uploads/${images.sticker1}`;
785
+ sticker1.style.display = 'block';
786
+ }
787
+
788
+ if (images.sticker2) {
789
+ const sticker2 = document.getElementById('sticker2');
790
+ sticker2.src = `/uploads/${images.sticker2}`;
791
+ sticker2.style.display = 'block';
792
+ }
793
+
794
+ // تحميل خلفية مخصصة
795
+ if (images.background) {
796
+ document.body.classList.add('custom-bg');
797
+ document.body.style.setProperty('--bg-image', `url(/uploads/${images.background})`);
798
+ }
799
+ } catch (error) {
800
+ console.log('Using default images');
801
+ }
802
+ }
803
+
804
+ // تهيئة الصفحة
805
+ window.onload = function() {
806
+ const button = document.getElementById('noButton');
807
+ button.style.position = 'absolute';
808
+ button.style.transform = 'translate(0, 0)';
809
+
810
+ // تحميل الصور المخصصة
811
+ loadCustomImages();
812
+
813
+ // تحميل الموسيقى
814
+ loadCustomMusic();
815
+ };
816
+
817
+ // محاولة تشغيل الموسيقى عند أول تفاعل
818
+ document.addEventListener('click', function initMusic() {
819
+ if (!musicPlaying) {
820
+ attemptAutoPlay();
821
+ }
822
+ document.removeEventListener('click', initMusic);
823
+ }, { once: true });
824
+ </script>
825
+ </body>
826
+ </html>