AbdulElahGwaith commited on
Commit
93c24ec
·
verified ·
1 Parent(s): 3bd4499

Upload folder using huggingface_hub

Browse files
README.md ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🚀 TaskFlow Pro v2.0
2
+
3
+ <div align="center">
4
+
5
+ ![TaskFlow Pro Logo](assets/images/logo.svg)
6
+
7
+ **منصة إدارة المشاريع الاحترافية - مبنية بـ Vanilla JavaScript**
8
+
9
+ *بناء مشاريعك بذكاء - بدون إطار عمل، بدون تعقيد*
10
+
11
+ [![HTML5](https://img.shields.io/badge/HTML5-E34F26?style=for-the-badge&logo=html5&logoColor=white)](https://developer.mozilla.org/en-US/docs/Web/HTML)
12
+ [![CSS3](https://img.shields.io/badge/CSS3-1572B6?style=for-the-badge&logo=css3&logoColor=white)](https://developer.mozilla.org/en-US/docs/Web/CSS)
13
+ [![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black)](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
14
+ [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)
15
+
16
+ *دعم كامل للغة العربية مع تصميم RTL*
17
+
18
+ </div>
19
+
20
+ ---
21
+
22
+ ## 📖 نظرة عامة على المشروع
23
+
24
+ ### ما هو TaskFlow Pro؟
25
+
26
+ **TaskFlow Pro** هو تطبيق ويب احترافي لإدارة المشاريع والمهام، تم بناؤه بالكامل باستخدام تقنيات الويب الأساسية (Vanilla HTML, CSS, JavaScript) دون الاعتماد على أي إطار عمل خارجي. يهدف التطبيق إلى توفير تجربة إدارة مشاريع سلسة وفعالة للفرق والأفراد الناطقين باللغة العربية.
27
+
28
+ ### فلسفة المشروع
29
+
30
+ - ✅ **بدون إطار عمل** - 100% Vanilla JavaScript
31
+ - ✅ **سريع وخفيف** - لا تحميل لمكتبة ضخمة
32
+ - ✅ **سهل الفهم** - كود نظيف وموثق
33
+ - ✅ **RTL مدمج** - دعم كامل للغة العربية
34
+ - ✅ **محلي بالكامل** - بياناتك تبقى على جهازك
35
+
36
+ ---
37
+
38
+ ## ✨ المميزات الرئيسية
39
+
40
+ ### 🎯 لوحة التحكم (Dashboard)
41
+ نظرة شاملة على جميع مشاريعك ومهامك مع إحصائيات تفصيلية ورسوم بيانية.
42
+
43
+ ### 📋 نظام كانبان (Kanban Board)
44
+ نظام سحب وإفلات بديهي لإدارة سير العمل عبر ثلاثة أعمدة: قيد الانتظار، قيد العمل، مكتمل.
45
+
46
+ ### 📅 التقويم الذكي
47
+ عرض تقويمي للمواعيد النهائية مع إمكانية التنقل بين الأشهر.
48
+
49
+ ### 👥 إدارة الفريق
50
+ إضافة أعضاء للفريق ومتابعة إنتاجيتهم وتصنيفهم.
51
+
52
+ ### 📈 التحليلات والتقارير
53
+ رسوم بيانية تفاعلية لتوزيع المهام ومعدل الإنجاز.
54
+
55
+ ### ⚙️ إعدادات شاملة
56
+ تخصيص الثيم والوضع الداكن والإشعارات واللغة.
57
+
58
+ ---
59
+
60
+ ## 🖼️ لقطات الشاشة
61
+
62
+ ### 1. لوحة التحكم الرئيسية
63
+ ![Dashboard](assets/screenshots/dashboard-preview.svg)
64
+
65
+ *عرض شامل للإحصائيات والمشاريع الأخيرة*
66
+
67
+ ### 2. إدارة المهام
68
+ ![Tasks](assets/screenshots/tasks-preview.svg)
69
+
70
+ *قائمة المهام مع الفلاتر والخيارات المتقدمة*
71
+
72
+ ### 3. لوحة كانبان
73
+ ![Kanban](assets/screenshots/kanban-preview.svg)
74
+
75
+ *نظام إدارة المهام بالسحب والإفلات*
76
+
77
+ ### 4. التقويم
78
+ ![Calendar](assets/screenshots/calendar-preview.svg)
79
+
80
+ *عرض شهري للمواعيد والمهام*
81
+
82
+ ### 5. إدارة الفريق
83
+ ![Team](assets/screenshots/team-preview.svg)
84
+
85
+ *أعضاء الفريق وإحصائياتهم*
86
+
87
+ ### 6. التحليلات
88
+ ![Analytics](assets/screenshots/analytics-preview.svg)
89
+
90
+ *رسوم بيانية تفاعلية*
91
+
92
+ ### 7. الوضع الداكن
93
+ ![Dark Mode](assets/screenshots/dark-mode-preview.svg)
94
+
95
+ *دعم كامل للثيم الداكن*
96
+
97
+ ### 8. التوافق مع الجوال
98
+ ![Mobile](assets/screenshots/mobile-preview.svg)
99
+
100
+ *تصميم متجاوب يعمل على جميع الأجهزة*
101
+
102
+ ---
103
+
104
+ ## 🎬 فيديو تعريفي
105
+
106
+ ### وصف الفيديو
107
+
108
+ ```
109
+ المدة: 60 ثانية
110
+ اللغة: عربي
111
+ القرار: 1080p
112
+ ```
113
+
114
+ ### مشاهد الفيديو
115
+
116
+ | المدة | المشهد | الوصف |
117
+ |-------|--------|-------|
118
+ | 0:00-0:05 | مقدمة | شعار TaskFlow Pro + عنوان |
119
+ | 0:05-0:15 | جولة لوحة التحكم | عرض الإحصائيات والأنشطة |
120
+ | 0:15-0:25 | عرض كانبان | سحب وإفلات المهام |
121
+ | 0:25-0:35 | إضافة مهمة | فتح النموذج وملؤه |
122
+ | 0:35-0:45 | التقويم | عرض المواعيد والمهام |
123
+ | 0:45-0:55 | الفريق | عرض أعضاء الفريق |
124
+ | 0:55-1:00 | خاتمة | "مبني بـ Vanilla JavaScript" |
125
+
126
+ ### فيديو الإنتاج
127
+ تفاصيل إنتاج الفيديو متاحة في: [docs/video-production.md](docs/video-production.md)
128
+
129
+ ---
130
+
131
+ ## 🚀 بدء الاستخدام
132
+
133
+ ### الطريقة 1: فتح الملف مباشرة
134
+
135
+ ```bash
136
+ cd taskflow-pro
137
+ # افتح index.html في المتصفح
138
+ ```
139
+
140
+ ### الطريقة 2: باستخدام خادم محلي
141
+
142
+ ```bash
143
+ # باستخدام Python
144
+ python -m http.server 8000
145
+
146
+ # أو باستخدام Node.js
147
+ npx serve taskflow-pro
148
+ ```
149
+
150
+ ---
151
+
152
+ ## 📁 هيكل المشروع
153
+
154
+ ```
155
+ taskflow-pro/
156
+
157
+ ├── 📄 index.html # الصفحة الرئيسية للتطبيق
158
+ ├── 📄 styles.css # جميع تنسيقات CSS
159
+ ├── 📄 script.js # منطق التطبيق والتفاعلات
160
+ ├── 📄 README.md # هذا الملف
161
+ ├── 📄 LICENSE # رخصة MIT
162
+
163
+ ├── 📁 assets/
164
+ │ ├── 📁 images/
165
+ │ │ └── logo.svg # شعار التطبيق
166
+ │ │ └── video-thumbnail.svg # صورة الفيديو المصغرة
167
+ │ │
168
+ │ └── 📁 screenshots/
169
+ │ ├── dashboard-preview.svg
170
+ │ ├── tasks-preview.svg
171
+ │ ├── kanban-preview.svg
172
+ │ ├── calendar-preview.svg
173
+ │ ├── team-preview.svg
174
+ │ ├── analytics-preview.svg
175
+ │ ├── dark-mode-preview.svg
176
+ │ └── mobile-preview.svg
177
+
178
+ └── 📁 docs/
179
+ └── video-production.md # تفاصيل إنتاج الفيديو
180
+ ```
181
+
182
+ ---
183
+
184
+ ## 🤝 المساهمة في المشروع
185
+
186
+ نرحب بمساهماتكم! للمشاركة:
187
+
188
+ ```bash
189
+ # 1. Fork المشروع
190
+ # 2. إنشاء فرع جديد
191
+ git checkout -b feature/amazing-feature
192
+
193
+ # 3. إجراء التغييرات وCommit
194
+ git commit -m 'إضافة ميزة رائعة'
195
+
196
+ # 4. Push وفتح Pull Request
197
+ ```
198
+
199
+ ---
200
+
201
+ ## ❓ الأسئلة الشائعة
202
+
203
+ **س: هل التطبيق يحتاج اتصال بالإنترنت؟**
204
+ ج: لا، يعمل محلياً. تحتاج الإنترنت فقط لتحميل الخطوط والأيقونات.
205
+
206
+ **س: هل بياناتي آمنة؟**
207
+ ج: نعم، تُخزن محلياً في LocalStorage.
208
+
209
+ **س: هل يدعم اللغة الإنجليزية؟**
210
+ ج: حالياً عربي فقط، الإنجليزية قادمة قريباً.
211
+
212
+ ---
213
+
214
+ ## 📄 الرخصة
215
+
216
+ هذا المشروع مرخص تحت رخصة MIT - انظر ملف [LICENSE](LICENSE) للتفاصيل.
217
+
218
+ ---
219
+
220
+ ## 📞 تواصل معنا
221
+
222
+ <div align="center">
223
+
224
+ [![GitHub](https://img.shields.io/badge/GitHub-100000?style=for-the-badge&logo=github&logoColor=white)](https://github.com/MiniMax-Agent/taskflow-pro)
225
+ [![Email](https://img.shields.io/badge/Email-D14836?style=for-the-badge&logo=gmail&logoColor=white)](mailto:support@minimax.dev)
226
+
227
+ ---
228
+
229
+ **صُنع بـ ❤️ باستخدام Vanilla JavaScript**
230
+
231
+ *TaskFlow Pro - إدارة مشاريعك بذكاء*
232
+
233
+ </div>
234
+
235
+ ---
236
+
237
+ <div align="left">
238
+
239
+ *آخر تحديث: 15 يناير 2025*
240
+ *الإصدار: 2.0.0*
241
+ *اللغة: العربية (RTL) + الإنجليزية*
242
+
243
+ </div>
assets/images/logo.svg ADDED
assets/images/video-thumbnail.svg ADDED
assets/screenshots/calendar-preview.svg ADDED
assets/screenshots/dark-mode-preview.svg ADDED
assets/screenshots/dashboard-preview.svg ADDED
assets/screenshots/kanban-preview.svg ADDED
assets/screenshots/mobile-preview.svg ADDED
assets/screenshots/tasks-preview.svg ADDED
assets/screenshots/team-preview.svg ADDED
docs/video-production.md ADDED
@@ -0,0 +1,328 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🎬 TaskFlow Pro - فيديو تعريفي احترافي
2
+
3
+ ## وثيقة إنتاج الفيديو
4
+
5
+ ### معلومات المشروع
6
+
7
+ | العنصر | التفاصيل |
8
+ |--------|----------|
9
+ | **اسم المشروع** | TaskFlow Pro v2.0 |
10
+ | **نوع الفيديو** | ترويجي تعريفي |
11
+ | **المدة المستهدفة** | 45-60 ثانية |
12
+ | **اللغة** | عربي |
13
+ | **الجمهور المستهدف** | مدراء المشاريع، الفرق التقنية، رواد الأعمال |
14
+
15
+ ---
16
+
17
+ ## 📝 السيناريو التفصيلي
18
+
19
+ ### المقدمة (5 ثوانٍ)
20
+ ```
21
+ [0:00 - 0:05]
22
+
23
+ 🎬 المشهد: شاشة سوداء تتلاشى تدريجياً
24
+
25
+ 🎵 موسيقى: موسيقى هادئة وعصرية (Electronic Ambient)
26
+
27
+ 📝 النص على الشاشة:
28
+ ┌─────────────────────────────────┐
29
+ │ │
30
+ │ 🚀 TaskFlow Pro v2.0 │
31
+ │ │
32
+ │ إدارة المشاريع الاحترافية │
33
+ │ │
34
+ │ 100% Vanilla JS │
35
+ │ │
36
+ └─────────────────────────────────┘
37
+
38
+ 🎨 التصميم: خط Cairo بخط عريض، تدرج لوني من البنفسجي إلى الأزرق الداكن
39
+ ```
40
+
41
+ ### جولة لوحة التحكم (15 ثانية)
42
+ ```
43
+ [0:05 - 0:20]
44
+
45
+ 🎬 المشهد 1: انتقال سلس (Fade) إلى لوحة التحكم
46
+
47
+ 📹 الكاميرا: تتحرك ببطء من الأعلى للأسفل
48
+
49
+ 🎨 العناصر المرئية:
50
+ ├── 📊 4 بطاقات إحصائيات متحركة
51
+ │ ├── إجمالي المشاريع: 3
52
+ │ ├── إجمالي المهام: 6
53
+ │ ├── المهام المكتملة: 2
54
+ │ └── أعضاء الفريق: 5
55
+
56
+ ├── 📁 المشاريع الأخيرة (اليسار)
57
+ │ └── أشرطة تقدم متحركة
58
+
59
+ └── 🔔 النشاط الأخير (اليمين)
60
+ └── قائمة الأنشطة الحديثة
61
+
62
+ 🎵 الموسيقى: تتحول لموسيقى أكثر حيوية
63
+
64
+ 📝 النص على الشاشة:
65
+ "نظرة شاملة على مشاريعك"
66
+ ```
67
+
68
+ ### عرض نظام كانبان (15 ثانية)
69
+ ```
70
+ [0:20 - 0:35]
71
+
72
+ 🎬 المشهد 2: انتقال (Slide Left) إلى لوحة كانبان
73
+
74
+ 📹 الكاميرا: تقريب على نظام السحب والإفلات
75
+
76
+ 🎨 العناصر المرئية:
77
+ ├── 📋 4 أعمدة كانبان
78
+ │ ├── 📝 للعمل (1 مهمة)
79
+ │ ├── 🔄 قيد العمل (2 مهام)
80
+ │ ├── 👁️ مراجعة (1 مهمة)
81
+ │ └── ✅ مكتمل (2 مهمة)
82
+
83
+ └── 🎯 بطاقات المهام
84
+ ├── عرض: العنوان، الأولوية، المسند إليه
85
+ └── تأثير: ظل عند التحويم
86
+
87
+ 🎵 الموسيقى: ذروة الموسيقى
88
+
89
+ 🎬 الحركة:
90
+ └── مؤشر الماوس يسحب بطاقة من "للعمل" إلى "قيد العمل"
91
+ └── تأثير انتقال سلس مع رسالة "تم تحديث المهمة"
92
+
93
+ 📝 النص على الشاشة:
94
+ "إدارة مهامك بسحب وإفلات بسيط"
95
+ ```
96
+
97
+ ### إضافة مهمة جديدة (10 ثوانٍ)
98
+ ```
99
+ [0:35 - 0:45]
100
+
101
+ 🎬 المشهد 3: نقر على زر "إضافة مهمة"
102
+
103
+ 📹 الكاميرا: انتقال سلس للنموذج المنبثق (Modal)
104
+
105
+ 🎨 العناصر المرئية:
106
+ ├── 📝 نموذج إضافة المهمة
107
+ │ ├── حقل العنوان
108
+ │ ├── حقل الوصف
109
+ │ ├── قائمة الأولوية (عالية/متوسطة/منخفضة)
110
+ │ ├── قائمة الحالة
111
+ │ ├── حقل المسند إليه
112
+ │ └── حقل تاريخ الاستحقاق
113
+
114
+ └── 🎯 إشعارات Toast
115
+ └── "تم إضافة المهمة بنجاح"
116
+
117
+ 🎵 الموسيقى: نغمة نجاح قصيرة
118
+
119
+ 🎬 الحركة:
120
+ └── ملء الحقول بسرعة
121
+ └── النقر على "حفظ"
122
+ └── إغلاق النموذج
123
+ └── ظهور المهمة في العمود المناسب
124
+ ```
125
+
126
+ ### التجاوب مع الجوال (5 ثوانٍ)
127
+ ```
128
+ [0:45 - 0:50]
129
+
130
+ 🎬 المشهد 4: تقليص نافذة المتصفح
131
+
132
+ 📹 الكاميرا: تصغير تدريجي
133
+
134
+ 🎨 العناصر المرئية:
135
+ ├── 📱 القائمة الجانبية تتحول لزر همبرغر
136
+ │ └── القائمة تنزلق من اليسار
137
+
138
+ └── 📐 إعادة ترتيب العناصر
139
+ └── بطاقات الإحصائ��ات تتراص في عمود واحد
140
+ └── لوحة كانبان تصبح أفقية
141
+
142
+ 📝 النص على الشاشة:
143
+ "يعمل بسلاسة على جميع الأجهزة"
144
+ ```
145
+
146
+ ### الخاتمة (5 ثوانٍ)
147
+ ```
148
+ [0:50 - 0:55]
149
+
150
+ 🎬 المشهد: شاشة ختامية
151
+
152
+ 🎨 التصميم:
153
+ ├── 🖥️ أيقونة TaskFlow Pro الكبيرة
154
+ │ └── شبكة العقد المتصلة
155
+ │ └── علامة الصح في المنتصف
156
+
157
+ ├── 📝 النص:
158
+ │ ┌─────────────────────────────┐
159
+ │ │ │
160
+ │ │ TaskFlow Pro │
161
+ │ │ │
162
+ │ │ بني بـ 100% Vanilla JS │
163
+ │ │ بدون إطار عمل │
164
+ │ │ │
165
+ │ │ 🔗 جربه الآن │
166
+ │ │ │
167
+ │ └─────────────────────────────┘
168
+
169
+ └── 🏷️ الشارات
170
+ └── HTML5 | CSS3 | JavaScript | MIT License
171
+
172
+ 🎵 الموسيقى: ذروة نهائية ثم تلاشي
173
+
174
+ 📝 رابط الموقع:
175
+ https://taskflow-pro.demo
176
+ ```
177
+
178
+ ---
179
+
180
+ ## 🎨 الدليل البصري
181
+
182
+ ### الألوان المستخدمة
183
+
184
+ ```css
185
+ /* التدرج الرئيسي */
186
+ --primary-gradient: linear-gradient(135deg, #4F46E5, #3730A3);
187
+
188
+ /* ألوان البطاقات */
189
+ --card-bg: #FFFFFF;
190
+ --card-hover: #F9FAFB;
191
+
192
+ /* ألوان الأولوية */
193
+ --priority-high: #EF4444; /* أحمر */
194
+ --priority-medium: #F59E0B; /* برتقالي */
195
+ --priority-low: #10B981; /* أخضر */
196
+
197
+ /* ألوان الحالة */
198
+ --status-todo: #6366F1; /* بنفسجي */
199
+ --status-progress: #3B82F6; /* أزرق */
200
+ --status-review: #F59E0B; /* برتقالي */
201
+ --status-done: #10B981; /* أخضر */
202
+ ```
203
+
204
+ ### الخطوط
205
+
206
+ ```css
207
+ /* العنوان الرئيسي */
208
+ font-family: 'Cairo', sans-serif;
209
+ font-weight: 700;
210
+ font-size: 2.25rem; /* 36px */
211
+
212
+ /* العناوين الفرعية */
213
+ font-family: 'Cairo', sans-serif;
214
+ font-weight: 600;
215
+ font-size: 1.25rem; /* 20px */
216
+
217
+ /* النص العادي */
218
+ font-family: 'Cairo', sans-serif;
219
+ font-weight: 400;
220
+ font-size: 1rem; /* 16px */
221
+ ```
222
+
223
+ ---
224
+
225
+ ## 🎵 دليل الموسيقى والمؤثرات الصوتية
226
+
227
+ ### المقاطع الموسيقية (Background Music)
228
+
229
+ | المقطع | المدة | الوصف | المشهد |
230
+ |--------|-------|-------|--------|
231
+ | **Intro** | 5 ثوانٍ | موسيقى إلكترونية هادئة | المقدمة |
232
+ | **Discovery** | 15 ثانية | موسيقى إيجابية خفيفة | لوحة التحكم |
233
+ | **Action** | 15 ثانية | موسيقى نشطة مع إيقاع | كانبان |
234
+ | **Success** | 10 ثوانٍ | نغمة نجاح مبهجة | إضافة مهمة |
235
+ | **Mobile** | 5 ثوانٍ | موسيقى سريعة خفيفة | التجاوب |
236
+ | **Outro** | 5 ثوانٍ | ذروة نهائية وتلاشي | الخاتمة |
237
+
238
+ ### المؤثرات الصوتية (SFX)
239
+
240
+ | المؤثر | الوصف | المشهد |
241
+ |--------|-------|--------|
242
+ | **Whoosh** | صوت انتقال سريع | تغيير المشاهد |
243
+ | **Pop** | صوت نقر خفيف | النقر على الأزرار |
244
+ | **Slide** | صوت سحب | السحب والإفلات |
245
+ | **Success Chime** | صوت نجاح | حفظ المهمة |
246
+ | **Notification** | صوت إشعار | ظهور Toast |
247
+
248
+ ---
249
+
250
+ ## 📐 إرشادات الإنتاج
251
+
252
+ ### للمصورين/المصممين
253
+
254
+ 1. **استخدم برنامج تسجيل الشاشة:**
255
+ - OBS Studio (مجاني)
256
+ - Camtasia (مدفوع)
257
+ - ScreenFlow (Mac)
258
+
259
+ 2. **إعدادات التسجيل:**
260
+ - الدقة: 1920x1080 (Full HD)
261
+ - معدل الإطارات: 60 fps
262
+ - الضغط: H.264
263
+
264
+ 3. **المؤثرات البصرية:**
265
+ - انتقالات: Fade, Slide, Zoom
266
+ - مدة الانتقالات: 0.3-0.5 ثانية
267
+ - حركة النص: Typing effect
268
+
269
+ ### للمونتير
270
+
271
+ 1. **البرنامج:**
272
+ - DaVinci Resolve (مجاني)
273
+ - Adobe Premiere Pro
274
+ - Final Cut Pro
275
+
276
+ 2. **التنسيق النهائي:**
277
+ - MP4
278
+ - H.264 codec
279
+ - 1080p, 60fps
280
+ -_bitrate: 15-20 Mbps
281
+
282
+ ---
283
+
284
+ ## 📋 قائمة التحقق قبل النشر
285
+
286
+ - [ ] جميع المشاهد مسجلة بجودة عالية
287
+ - [ ] الموسيقى والمؤثرات الصوتية جاهزة
288
+ - [ ] النص واضح ومقروء
289
+ - [ ] الألوان متسقة مع الهوية البصرية
290
+ - [ ] لا توجد أخطاء إملائية
291
+ - [ ] الروابط تعمل بشكل صحيح
292
+ - [ ] الفيديو مُحسّن للويب (حجم صغير)
293
+ - [ ] نسخة احتياطية محفوظة
294
+
295
+ ---
296
+
297
+ ## 🔗 الموارد الإضافية
298
+
299
+ ### أدوات مفيدة
300
+
301
+ | الأداة | الاستخدام | الرابط |
302
+ |--------|----------|--------|
303
+ | Canva | تصميم الصور المصغرة | canva.com |
304
+ | Figma | تصميم wireframes | figma.com |
305
+ | LottieFiles | رسوم متحركة | lottiefiles.com |
306
+ | Remove.bg | إزالة الخلفية | remove.bg |
307
+
308
+ ### مصادر الموسيقى
309
+
310
+ | المصدر | النوع | الرابط |
311
+ |--------|-------|--------|
312
+ | Epidemic Sound | موسيقى مدفوعة | epidemicsound.com |
313
+ | Artlist | موسيقى مدفوعة | artlist.io |
314
+ | YouTube Audio Library | مجانية | youtube.com/audiolibrary |
315
+
316
+ ---
317
+
318
+ ## 📞 معلومات التواصل
319
+
320
+ للاستفسارات حول إنتاج الفيديو:
321
+
322
+ - **البريد الإلكتروني:** video@taskflow-pro.dev
323
+ - **الموقع:** https://taskflow-pro.dev
324
+
325
+ ---
326
+
327
+ *آخر تحديث: 15 يناير 2025*
328
+ *الإصدار: 1.0*
index.html ADDED
@@ -0,0 +1,1059 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>TaskFlow Pro - إدارة المهام الاحترافية</title>
7
+ <link rel="stylesheet" href="styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <link href="https://fonts.googleapis.com/css2?family=Cairo:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
10
+ <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📋</text></svg>">
11
+ </head>
12
+ <body>
13
+ <!-- شاشة التحميل -->
14
+ <div id="loading-screen" class="loading-screen">
15
+ <div class="loading-content">
16
+ <div class="loading-spinner"></div>
17
+ <h2>TaskFlow Pro</h2>
18
+ <p>جاري تحميل التطبيق...</p>
19
+ </div>
20
+ </div>
21
+
22
+ <!-- صفحة تسجيل الدخول -->
23
+ <div id="login-page" class="login-page">
24
+ <div class="login-container">
25
+ <div class="login-header">
26
+ <div class="logo">
27
+ <i class="fas fa-clipboard-check"></i>
28
+ </div>
29
+ <h1>TaskFlow Pro</h1>
30
+ <p>إدارة المهام الاحترافية</p>
31
+ </div>
32
+ <form id="login-form" class="login-form">
33
+ <div class="form-group">
34
+ <label for="login-email">البريد الإلكتروني</label>
35
+ <input type="email" id="login-email" placeholder="أدخل بريدك الإلكتروني" required>
36
+ <i class="fas fa-envelope"></i>
37
+ </div>
38
+ <div class="form-group">
39
+ <label for="login-password">كلمة المرور</label>
40
+ <input type="password" id="login-password" placeholder="أدخل كلمة المرور" required>
41
+ <i class="fas fa-lock"></i>
42
+ </div>
43
+ <button type="submit" class="btn btn-primary btn-block">
44
+ <span>تسجيل الدخول</span>
45
+ <i class="fas fa-sign-in-alt"></i>
46
+ </button>
47
+ <div class="login-options">
48
+ <label class="remember-me">
49
+ <input type="checkbox" id="remember-me">
50
+ <span>تذكرني</span>
51
+ </label>
52
+ <a href="#" class="forgot-password">نسيت كلمة المرور؟</a>
53
+ </div>
54
+ <div class="divider">
55
+ <span>أو</span>
56
+ </div>
57
+ <button type="button" class="btn btn-social btn-google" id="google-login">
58
+ <i class="fab fa-google"></i>
59
+ <span>تسجيل الدخول باستخدام Google</span>
60
+ </button>
61
+ <button type="button" class="btn btn-social btn-github" id="github-login">
62
+ <i class="fab fa-github"></i>
63
+ <span>تسجيل الدخول باستخدام GitHub</span>
64
+ </button>
65
+ <p class="signup-link">ليس لديك حساب؟ <a href="#" id="show-register">إنشاء حساب جديد</a></p>
66
+ </form>
67
+
68
+ <!-- نموذج التسجيل -->
69
+ <form id="register-form" class="login-form hidden">
70
+ <div class="form-group">
71
+ <label for="register-name">الاسم الكامل</label>
72
+ <input type="text" id="register-name" placeholder="أدخل اسمك الكامل" required>
73
+ <i class="fas fa-user"></i>
74
+ </div>
75
+ <div class="form-group">
76
+ <label for="register-email">البريد الإلكتروني</label>
77
+ <input type="email" id="register-email" placeholder="أدخل بريدك الإلكتروني" required>
78
+ <i class="fas fa-envelope"></i>
79
+ </div>
80
+ <div class="form-group">
81
+ <label for="register-password">كلمة المرور</label>
82
+ <input type="password" id="register-password" placeholder="أنشئ كلمة مرور" required>
83
+ <i class="fas fa-lock"></i>
84
+ </div>
85
+ <div class="form-group">
86
+ <label for="register-confirm">تأكيد كلمة المرور</label>
87
+ <input type="password" id="register-confirm" placeholder="أعد إدخال كلمة المرور" required>
88
+ <i class="fas fa-lock"></i>
89
+ </div>
90
+ <button type="submit" class="btn btn-primary btn-block">
91
+ <span>إنشاء حساب</span>
92
+ <i class="fas fa-user-plus"></i>
93
+ </button>
94
+ <p class="signup-link">لديك حساب بالفعل؟ <a href="#" id="show-login">تسجيل الدخول</a></p>
95
+ </form>
96
+ </div>
97
+ </div>
98
+
99
+ <!-- التطبيق الرئيسي -->
100
+ <div id="main-app" class="main-app hidden">
101
+ <!-- الشريط الجانبي -->
102
+ <aside class="sidebar" id="sidebar">
103
+ <div class="sidebar-header">
104
+ <div class="logo">
105
+ <i class="fas fa-clipboard-check"></i>
106
+ <span>TaskFlow Pro</span>
107
+ </div>
108
+ <button class="sidebar-toggle" id="sidebar-toggle">
109
+ <i class="fas fa-chevron-right"></i>
110
+ </button>
111
+ </div>
112
+ <nav class="sidebar-nav">
113
+ <ul>
114
+ <li class="active" data-view="dashboard">
115
+ <a href="#dashboard">
116
+ <i class="fas fa-home"></i>
117
+ <span>لوحة التحكم</span>
118
+ </a>
119
+ </li>
120
+ <li data-view="tasks">
121
+ <a href="#tasks">
122
+ <i class="fas fa-tasks"></i>
123
+ <span>المهام</span>
124
+ </a>
125
+ </li>
126
+ <li data-view="projects">
127
+ <a href="#projects">
128
+ <i class="fas fa-project-diagram"></i>
129
+ <span>المشاريع</span>
130
+ </a>
131
+ </li>
132
+ <li data-view="kanban">
133
+ <a href="#kanban">
134
+ <i class="fas fa-columns"></i>
135
+ <span>لوحة كانبان</span>
136
+ </a>
137
+ </li>
138
+ <li data-view="calendar">
139
+ <a href="#calendar">
140
+ <i class="fas fa-calendar-alt"></i>
141
+ <span>التقويم</span>
142
+ </a>
143
+ </li>
144
+ <li data-view="team">
145
+ <a href="#team">
146
+ <i class="fas fa-users"></i>
147
+ <span>الفريق</span>
148
+ </a>
149
+ </li>
150
+ <li data-view="analytics">
151
+ <a href="#analytics">
152
+ <i class="fas fa-chart-pie"></i>
153
+ <span>التحليلات</span>
154
+ </a>
155
+ </li>
156
+ </ul>
157
+ </nav>
158
+ <div class="sidebar-footer">
159
+ <ul>
160
+ <li data-view="settings">
161
+ <a href="#settings">
162
+ <i class="fas fa-cog"></i>
163
+ <span>الإعدادات</span>
164
+ </a>
165
+ </li>
166
+ <li id="logout-btn">
167
+ <a href="#">
168
+ <i class="fas fa-sign-out-alt"></i>
169
+ <span>تسجيل الخروج</span>
170
+ </a>
171
+ </li>
172
+ </ul>
173
+ </div>
174
+ </aside>
175
+
176
+ <!-- المحتوى الرئيسي -->
177
+ <main class="main-content">
178
+ <!-- الرأس العلوي -->
179
+ <header class="main-header">
180
+ <div class="header-right">
181
+ <button class="menu-toggle" id="menu-toggle">
182
+ <i class="fas fa-bars"></i>
183
+ </button>
184
+ <div class="search-box">
185
+ <i class="fas fa-search"></i>
186
+ <input type="text" placeholder="البحث في المهام والمشاريع..." id="global-search">
187
+ </div>
188
+ </div>
189
+ <div class="header-left">
190
+ <div class="header-actions">
191
+ <button class="action-btn" id="quick-add" title="إضافة سريعة">
192
+ <i class="fas fa-plus"></i>
193
+ </button>
194
+ <div class="notifications-dropdown">
195
+ <button class="action-btn" id="notifications-btn" title="الإشعارات">
196
+ <i class="fas fa-bell"></i>
197
+ <span class="badge" id="notification-count">3</span>
198
+ </button>
199
+ <div class="dropdown-menu notifications-menu" id="notifications-menu">
200
+ <div class="dropdown-header">
201
+ <h4>الإشعارات</h4>
202
+ <button class="mark-all-read">تعليم الكل كمقروء</button>
203
+ </div>
204
+ <div class="notifications-list" id="notifications-list">
205
+ <!-- الإشعارات سيتم إضافتها هنا -->
206
+ </div>
207
+ </div>
208
+ </div>
209
+ <div class="user-dropdown">
210
+ <button class="user-btn" id="user-btn">
211
+ <img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><rect fill='%234a90d9' width='100' height='100'/><text x='50' y='60' text-anchor='middle' fill='white' font-size='50'>م</text></svg>" alt="المستخدم" class="user-avatar">
212
+ <span class="user-name" id="user-name">مستخدم جديد</span>
213
+ <i class="fas fa-chevron-down"></i>
214
+ </button>
215
+ <div class="dropdown-menu user-menu" id="user-menu">
216
+ <a href="#" data-action="profile">
217
+ <i class="fas fa-user"></i>
218
+ <span>الملف الشخصي</span>
219
+ </a>
220
+ <a href="#" data-action="settings">
221
+ <i class="fas fa-cog"></i>
222
+ <span>الإعدادات</span>
223
+ </a>
224
+ <div class="divider"></div>
225
+ <a href="#" data-action="logout">
226
+ <i class="fas fa-sign-out-alt"></i>
227
+ <span>تسجيل الخروج</span>
228
+ </a>
229
+ </div>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ </header>
234
+
235
+ <!-- منطقة المحتوى -->
236
+ <div class="content-area">
237
+ <!-- لوحة التحكم -->
238
+ <section id="dashboard-view" class="view active">
239
+ <div class="view-header">
240
+ <h1>لوحة التحكم</h1>
241
+ <div class="view-actions">
242
+ <button class="btn btn-primary" id="new-task-btn">
243
+ <i class="fas fa-plus"></i>
244
+ <span>مهمة جديدة</span>
245
+ </button>
246
+ </div>
247
+ </div>
248
+ <div class="dashboard-stats">
249
+ <div class="stat-card">
250
+ <div class="stat-icon blue">
251
+ <i class="fas fa-tasks"></i>
252
+ </div>
253
+ <div class="stat-info">
254
+ <h3 id="total-tasks">0</h3>
255
+ <p>إجمالي المهام</p>
256
+ </div>
257
+ </div>
258
+ <div class="stat-card">
259
+ <div class="stat-icon green">
260
+ <i class="fas fa-check-circle"></i>
261
+ </div>
262
+ <div class="stat-info">
263
+ <h3 id="completed-tasks">0</h3>
264
+ <p>المهام المُنجزة</p>
265
+ </div>
266
+ </div>
267
+ <div class="stat-card">
268
+ <div class="stat-icon orange">
269
+ <i class="fas fa-clock"></i>
270
+ </div>
271
+ <div class="stat-info">
272
+ <h3 id="pending-tasks">0</h3>
273
+ <p>المهام المعلقة</p>
274
+ </div>
275
+ </div>
276
+ <div class="stat-card">
277
+ <div class="stat-icon purple">
278
+ <i class="fas fa-project-diagram"></i>
279
+ </div>
280
+ <div class="stat-info">
281
+ <h3 id="total-projects">0</h3>
282
+ <p>المشاريع النشطة</p>
283
+ </div>
284
+ </div>
285
+ </div>
286
+ <div class="dashboard-content">
287
+ <div class="dashboard-main">
288
+ <div class="card">
289
+ <div class="card-header">
290
+ <h3><i class="fas fa-chart-line"></i> تقدم المهام</h3>
291
+ </div>
292
+ <div class="card-body">
293
+ <div class="progress-chart">
294
+ <div class="progress-bar-container">
295
+ <div class="progress-label">
296
+ <span>نسبة الإنجاز</span>
297
+ <span id="completion-percentage">0%</span>
298
+ </div>
299
+ <div class="progress-bar">
300
+ <div class="progress-fill" id="progress-fill"></div>
301
+ </div>
302
+ </div>
303
+ <div class="chart-legend">
304
+ <div class="legend-item">
305
+ <span class="legend-color completed"></span>
306
+ <span>مكتمل</span>
307
+ </div>
308
+ <div class="legend-item">
309
+ <span class="legend-color in-progress"></span>
310
+ <span>قيد العمل</span>
311
+ </div>
312
+ <div class="legend-item">
313
+ <span class="legend-color pending"></span>
314
+ <span>قيد الانتظار</span>
315
+ </div>
316
+ </div>
317
+ </div>
318
+ </div>
319
+ </div>
320
+ <div class="card">
321
+ <div class="card-header">
322
+ <h3><i class="fas fa-star"></i> المهام المميزة</h3>
323
+ <a href="#" class="view-all" data-view="tasks">عرض الكل</a>
324
+ </div>
325
+ <div class="card-body">
326
+ <ul class="featured-tasks" id="featured-tasks">
327
+ <!-- المهام المميزة سيتم إضافتها هنا -->
328
+ </ul>
329
+ </div>
330
+ </div>
331
+ </div>
332
+ <div class="dashboard-sidebar">
333
+ <div class="card">
334
+ <div class="card-header">
335
+ <h3><i class="fas fa-calendar-check"></i> مهام اليوم</h3>
336
+ </div>
337
+ <div class="card-body">
338
+ <ul class="today-tasks" id="today-tasks">
339
+ <!-- مهام اليوم سيتم إضافتها هنا -->
340
+ </ul>
341
+ </div>
342
+ </div>
343
+ <div class="card">
344
+ <div class="card-header">
345
+ <h3><i class="fas fa-chart-pie"></i> توزيع المهام</h3>
346
+ </div>
347
+ <div class="card-body">
348
+ <div class="tasks-distribution">
349
+ <div class="distribution-item">
350
+ <div class="distribution-info">
351
+ <span>عالية الأولوية</span>
352
+ <span id="high-priority-count">0</span>
353
+ </div>
354
+ <div class="distribution-bar">
355
+ <div class="distribution-fill high" id="high-priority-bar"></div>
356
+ </div>
357
+ </div>
358
+ <div class="distribution-item">
359
+ <div class="distribution-info">
360
+ <span>متوسطة الأولوية</span>
361
+ <span id="medium-priority-count">0</span>
362
+ </div>
363
+ <div class="distribution-bar">
364
+ <div class="distribution-fill medium" id="medium-priority-bar"></div>
365
+ </div>
366
+ </div>
367
+ <div class="distribution-item">
368
+ <div class="distribution-info">
369
+ <span>منخفضة الأولوية</span>
370
+ <span id="low-priority-count">0</span>
371
+ </div>
372
+ <div class="distribution-bar">
373
+ <div class="distribution-fill low" id="low-priority-bar"></div>
374
+ </div>
375
+ </div>
376
+ </div>
377
+ </div>
378
+ </div>
379
+ </div>
380
+ </div>
381
+ </section>
382
+
383
+ <!-- عرض المهام -->
384
+ <section id="tasks-view" class="view">
385
+ <div class="view-header">
386
+ <h1>المهام</h1>
387
+ <div class="view-actions">
388
+ <div class="filter-group">
389
+ <select id="task-filter-project">
390
+ <option value="all">جميع المشاريع</option>
391
+ </select>
392
+ <select id="task-filter-status">
393
+ <option value="all">جميع الحالات</option>
394
+ <option value="pending">قيد الانتظار</option>
395
+ <option value="in-progress">قيد العمل</option>
396
+ <option value="completed">مكتمل</option>
397
+ </select>
398
+ <select id="task-filter-priority">
399
+ <option value="all">جميع الأولويات</option>
400
+ <option value="high">عالية</option>
401
+ <option value="medium">متوسطة</option>
402
+ <option value="low">منخفضة</option>
403
+ </select>
404
+ </div>
405
+ <button class="btn btn-primary" id="add-task-btn">
406
+ <i class="fas fa-plus"></i>
407
+ <span>إضافة مهمة</span>
408
+ </button>
409
+ </div>
410
+ </div>
411
+ <div class="tasks-container">
412
+ <div class="tasks-header">
413
+ <div class="task-checkbox"></div>
414
+ <div class="task-title">عنوان المهمة</div>
415
+ <div class="task-project">المشروع</div>
416
+ <div class="task-priority">الأولوية</div>
417
+ <div class="task-due-date">تاريخ الاستحقاق</div>
418
+ <div class="task-status">الحالة</div>
419
+ <div class="task-actions">الإجراءات</div>
420
+ </div>
421
+ <div class="tasks-list" id="tasks-list">
422
+ <!-- المهام سيتم إضافتها هنا -->
423
+ </div>
424
+ <div class="empty-state" id="empty-tasks">
425
+ <i class="fas fa-tasks"></i>
426
+ <h3>لا توجد مهام حالياً</h3>
427
+ <p>ابدأ بإضافة مهمتك الأولى</p>
428
+ <button class="btn btn-primary" id="empty-add-task">
429
+ <i class="fas fa-plus"></i>
430
+ <span>إضافة مهمة</span>
431
+ </button>
432
+ </div>
433
+ </div>
434
+ </section>
435
+
436
+ <!-- عرض المشاريع -->
437
+ <section id="projects-view" class="view">
438
+ <div class="view-header">
439
+ <h1>المشاريع</h1>
440
+ <div class="view-actions">
441
+ <button class="btn btn-primary" id="add-project-btn">
442
+ <i class="fas fa-plus"></i>
443
+ <span>مشروع جديد</span>
444
+ </button>
445
+ </div>
446
+ </div>
447
+ <div class="projects-grid" id="projects-grid">
448
+ <!-- المشاريع سيتم إضافتها هنا -->
449
+ </div>
450
+ <div class="empty-state" id="empty-projects">
451
+ <i class="fas fa-project-diagram"></i>
452
+ <h3>لا توجد مشاريع حالياً</h3>
453
+ <p>أنشئ مشروعك الأول لبدء العمل</p>
454
+ <button class="btn btn-primary" id="empty-add-project">
455
+ <i class="fas fa-plus"></i>
456
+ <span>إنشاء مشروع</span>
457
+ </button>
458
+ </div>
459
+ </section>
460
+
461
+ <!-- عرض لوحة كانبان -->
462
+ <section id="kanban-view" class="view">
463
+ <div class="view-header">
464
+ <h1>لوحة كانبان</h1>
465
+ <div class="view-actions">
466
+ <select id="kanban-project-filter">
467
+ <option value="all">جميع المشاريع</option>
468
+ </select>
469
+ </div>
470
+ </div>
471
+ <div class="kanban-board" id="kanban-board">
472
+ <div class="kanban-column" data-status="pending">
473
+ <div class="column-header">
474
+ <h3><i class="fas fa-clock"></i> قيد الانتظار</h3>
475
+ <span class="task-count">0</span>
476
+ </div>
477
+ <div class="column-content" id="kanban-pending">
478
+ <!-- المهام سيتم إضافتها هنا -->
479
+ </div>
480
+ <button class="add-task-to-column" data-status="pending">
481
+ <i class="fas fa-plus"></i>
482
+ <span>إضافة مهمة</span>
483
+ </button>
484
+ </div>
485
+ <div class="kanban-column" data-status="in-progress">
486
+ <div class="column-header">
487
+ <h3><i class="fas fa-spinner"></i> قيد العمل</h3>
488
+ <span class="task-count">0</span>
489
+ </div>
490
+ <div class="column-content" id="kanban-in-progress">
491
+ <!-- المهام سيتم إضافتها هنا -->
492
+ </div>
493
+ <button class="add-task-to-column" data-status="in-progress">
494
+ <i class="fas fa-plus"></i>
495
+ <span>إضافة مهمة</span>
496
+ </button>
497
+ </div>
498
+ <div class="kanban-column" data-status="completed">
499
+ <div class="column-header">
500
+ <h3><i class="fas fa-check-circle"></i> مكتمل</h3>
501
+ <span class="task-count">0</span>
502
+ </div>
503
+ <div class="column-content" id="kanban-completed">
504
+ <!-- المهام سيتم إضافتها هنا -->
505
+ </div>
506
+ <button class="add-task-to-column" data-status="completed">
507
+ <i class="fas fa-plus"></i>
508
+ <span>إضافة مهمة</span>
509
+ </button>
510
+ </div>
511
+ </div>
512
+ </section>
513
+
514
+ <!-- عرض التقويم -->
515
+ <section id="calendar-view" class="view">
516
+ <div class="view-header">
517
+ <h1>التقويم</h1>
518
+ <div class="view-actions">
519
+ <div class="calendar-nav">
520
+ <button class="btn btn-icon" id="calendar-prev">
521
+ <i class="fas fa-chevron-right"></i>
522
+ </button>
523
+ <h3 id="current-month">يناير 2025</h3>
524
+ <button class="btn btn-icon" id="calendar-next">
525
+ <i class="fas fa-chevron-left"></i>
526
+ </button>
527
+ </div>
528
+ <button class="btn btn-secondary" id="today-btn">اليوم</button>
529
+ </div>
530
+ </div>
531
+ <div class="calendar-container">
532
+ <div class="calendar-header">
533
+ <div class="day-name">السبت</div>
534
+ <div class="day-name">الأحد</div>
535
+ <div class="day-name">الإثنين</div>
536
+ <div class="day-name">الثلاثاء</div>
537
+ <div class="day-name">الأربعاء</div>
538
+ <div class="day-name">الخميس</div>
539
+ <div class="day-name">الجمعة</div>
540
+ </div>
541
+ <div class="calendar-grid" id="calendar-grid">
542
+ <!-- أيام التقويم سيتم إضافتها هنا -->
543
+ </div>
544
+ </div>
545
+ <div class="calendar-legend">
546
+ <div class="legend-item">
547
+ <span class="legend-dot high"></span>
548
+ <span>عالية الأولوية</span>
549
+ </div>
550
+ <div class="legend-item">
551
+ <span class="legend-dot medium"></span>
552
+ <span>متوسطة الأولوية</span>
553
+ </div>
554
+ <div class="legend-item">
555
+ <span class="legend-dot low"></span>
556
+ <span>منخفضة الأولوية</span>
557
+ </div>
558
+ <div class="legend-item">
559
+ <span class="legend-dot completed"></span>
560
+ <span>مكتمل</span>
561
+ </div>
562
+ </div>
563
+ </section>
564
+
565
+ <!-- عرض الفريق -->
566
+ <section id="team-view" class="view">
567
+ <div class="view-header">
568
+ <h1>الفريق</h1>
569
+ <div class="view-actions">
570
+ <button class="btn btn-primary" id="invite-member-btn">
571
+ <i class="fas fa-user-plus"></i>
572
+ <span>دعوة عضو</span>
573
+ </button>
574
+ </div>
575
+ </div>
576
+ <div class="team-grid" id="team-grid">
577
+ <!-- أعضاء الفريق سيتم إضافتهم هنا -->
578
+ </div>
579
+ <div class="empty-state" id="empty-team">
580
+ <i class="fas fa-users"></i>
581
+ <h3>لا يوجد أعضاء في الفريق</h3>
582
+ <p>ابدأ بدعوة أعضاء للفريق</p>
583
+ <button class="btn btn-primary" id="empty-invite">
584
+ <i class="fas fa-user-plus"></i>
585
+ <span>دعوة عضو</span>
586
+ </button>
587
+ </div>
588
+ </section>
589
+
590
+ <!-- عرض التحليلات -->
591
+ <section id="analytics-view" class="view">
592
+ <div class="view-header">
593
+ <h1>التحليلات</h1>
594
+ <div class="view-actions">
595
+ <select id="analytics-period">
596
+ <option value="week">آخر أسبوع</option>
597
+ <option value="month" selected>آخر شهر</option>
598
+ <option value="year">آخر سنة</option>
599
+ </select>
600
+ </div>
601
+ </div>
602
+ <div class="analytics-grid">
603
+ <div class="analytics-card large">
604
+ <div class="card-header">
605
+ <h3><i class="fas fa-chart-bar"></i> أداء المهام</h3>
606
+ </div>
607
+ <div class="card-body">
608
+ <div class="chart-container">
609
+ <canvas id="tasks-chart"></canvas>
610
+ </div>
611
+ </div>
612
+ </div>
613
+ <div class="analytics-card">
614
+ <div class="card-header">
615
+ <h3><i class="fas fa-chart-pie"></i> توزيع الأولويات</h3>
616
+ </div>
617
+ <div class="card-body">
618
+ <div class="chart-container">
619
+ <canvas id="priority-chart"></canvas>
620
+ </div>
621
+ </div>
622
+ </div>
623
+ <div class="analytics-card">
624
+ <div class="card-header">
625
+ <h3><i class="fas fa-check-double"></i> معدل الإنجاز</h3>
626
+ </div>
627
+ <div class="card-body">
628
+ <div class="completion-rate">
629
+ <div class="rate-circle">
630
+ <svg viewBox="0 0 100 100">
631
+ <circle class="bg" cx="50" cy="50" r="45"></circle>
632
+ <circle class="progress" cx="50" cy="50" r="45" id="completion-circle"></circle>
633
+ </svg>
634
+ <div class="rate-value">
635
+ <span id="completion-rate-value">0</span>%
636
+ </div>
637
+ </div>
638
+ </div>
639
+ </div>
640
+ </div>
641
+ <div class="analytics-card">
642
+ <div class="card-header">
643
+ <h3><i class="fas fa-trophy"></i> أعلى الأعضاء إنتاجية</h3>
644
+ </div>
645
+ <div class="card-body">
646
+ <ul class="top-performers" id="top-performers">
647
+ <!-- سيتم إضافة أفضل الأعضاء هنا -->
648
+ </ul>
649
+ </div>
650
+ </div>
651
+ </div>
652
+ </section>
653
+
654
+ <!-- عرض الإعدادات -->
655
+ <section id="settings-view" class="view">
656
+ <div class="view-header">
657
+ <h1>الإعدادات</h1>
658
+ </div>
659
+ <div class="settings-container">
660
+ <div class="settings-sidebar">
661
+ <ul>
662
+ <li class="active" data-settings="profile">
663
+ <a href="#">
664
+ <i class="fas fa-user"></i>
665
+ <span>الملف الشخصي</span>
666
+ </a>
667
+ </li>
668
+ <li data-settings="notifications">
669
+ <a href="#">
670
+ <i class="fas fa-bell"></i>
671
+ <span>الإشعارات</span>
672
+ </a>
673
+ </li>
674
+ <li data-settings="appearance">
675
+ <a href="#">
676
+ <i class="fas fa-palette"></i>
677
+ <span>المظهر</span>
678
+ </a>
679
+ </li>
680
+ <li data-settings="security">
681
+ <a href="#">
682
+ <i class="fas fa-shield-alt"></i>
683
+ <span>الأمان</span>
684
+ </a>
685
+ </li>
686
+ <li data-settings="language">
687
+ <a href="#">
688
+ <i class="fas fa-language"></i>
689
+ <span>اللغة</span>
690
+ </a>
691
+ </li>
692
+ </ul>
693
+ </div>
694
+ <div class="settings-content">
695
+ <!-- إعدادات الملف الشخصي -->
696
+ <div class="settings-panel active" id="settings-profile">
697
+ <h2>الملف الشخصي</h2>
698
+ <form id="profile-form">
699
+ <div class="form-group">
700
+ <label for="settings-name">الاسم</label>
701
+ <input type="text" id="settings-name" placeholder="أدخل اسمك">
702
+ </div>
703
+ <div class="form-group">
704
+ <label for="settings-email">البريد الإلكتروني</label>
705
+ <input type="email" id="settings-email" placeholder="أدخل بريدك الإلكتروني">
706
+ </div>
707
+ <div class="form-group">
708
+ <label for="settings-phone">رقم الهاتف</label>
709
+ <input type="tel" id="settings-phone" placeholder="أدخل رقم هاتفك">
710
+ </div>
711
+ <div class="form-group">
712
+ <label for="settings-bio">نبذة عنك</label>
713
+ <textarea id="settings-bio" placeholder="اكتب نبذة قصيرة عن نفسك"></textarea>
714
+ </div>
715
+ <button type="submit" class="btn btn-primary">
716
+ <i class="fas fa-save"></i>
717
+ <span>حفظ التغييرات</span>
718
+ </button>
719
+ </form>
720
+ </div>
721
+
722
+ <!-- إعدادات الإشعارات -->
723
+ <div class="settings-panel" id="settings-notifications">
724
+ <h2>الإشعارات</h2>
725
+ <div class="settings-options">
726
+ <div class="setting-item">
727
+ <div class="setting-info">
728
+ <h4>إشعارات المهام الجديدة</h4>
729
+ <p>تلقي إشعارات عند إضافة مهام جديدة</p>
730
+ </div>
731
+ <label class="toggle-switch">
732
+ <input type="checkbox" id="notify-new-task" checked>
733
+ <span class="slider"></span>
734
+ </label>
735
+ </div>
736
+ <div class="setting-item">
737
+ <div class="setting-info">
738
+ <h4>تذكير بمواعيد الاستحقاق</h4>
739
+ <p>تلقي تذكيرات قبل انتهاء المهام</p>
740
+ </div>
741
+ <label class="toggle-switch">
742
+ <input type="checkbox" id="notify-due-date" checked>
743
+ <span class="slider"></span>
744
+ </label>
745
+ </div>
746
+ <div class="setting-item">
747
+ <div class="setting-info">
748
+ <h4>إشعارات التعليقات</h4>
749
+ <p>تلقي إشعارات عند إضافة تعليقات</p>
750
+ </div>
751
+ <label class="toggle-switch">
752
+ <input type="checkbox" id="notify-comments" checked>
753
+ <span class="slider"></span>
754
+ </label>
755
+ </div>
756
+ <div class="setting-item">
757
+ <div class="setting-info">
758
+ <h4>رسائل البريد الإلكتروني</h4>
759
+ <p>تلقي ملخصات دورية عبر البريد</p>
760
+ </div>
761
+ <label class="toggle-switch">
762
+ <input type="checkbox" id="notify-email">
763
+ <span class="slider"></span>
764
+ </label>
765
+ </div>
766
+ </div>
767
+ </div>
768
+
769
+ <!-- إعدادات المظهر -->
770
+ <div class="settings-panel" id="settings-appearance">
771
+ <h2>المظهر</h2>
772
+ <div class="settings-options">
773
+ <div class="setting-item">
774
+ <div class="setting-info">
775
+ <h4>الوضع الداكن</h4>
776
+ <p>تفعيل المظهر الداكن للتطبيق</p>
777
+ </div>
778
+ <label class="toggle-switch">
779
+ <input type="checkbox" id="dark-mode-toggle">
780
+ <span class="slider"></span>
781
+ </label>
782
+ </div>
783
+ <div class="setting-item">
784
+ <div class="setting-info">
785
+ <h4>اللون الرئيسي</h4>
786
+ <p>اختر لون التطبيق المفضل لديك</p>
787
+ </div>
788
+ <div class="color-options">
789
+ <button class="color-option blue" data-color="blue"></button>
790
+ <button class="color-option green" data-color="green"></button>
791
+ <button class="color-option purple" data-color="purple"></button>
792
+ <button class="color-option orange" data-color="orange"></button>
793
+ <button class="color-option pink" data-color="pink"></button>
794
+ </div>
795
+ </div>
796
+ <div class="setting-item">
797
+ <div class="setting-info">
798
+ <h4>حجم الخط</h4>
799
+ <p>ضبط حجم الخط في التطبيق</p>
800
+ </div>
801
+ <select id="font-size">
802
+ <option value="small">صغير</option>
803
+ <option value="medium" selected>متوسط</option>
804
+ <option value="large">كبير</option>
805
+ </select>
806
+ </div>
807
+ </div>
808
+ </div>
809
+
810
+ <!-- إعدادات الأمان -->
811
+ <div class="settings-panel" id="settings-security">
812
+ <h2>الأمان</h2>
813
+ <form id="security-form">
814
+ <div class="form-group">
815
+ <label for="current-password">كلمة المرور الحالية</label>
816
+ <input type="password" id="current-password" placeholder="أدخل كلمة المرور الحالية">
817
+ </div>
818
+ <div class="form-group">
819
+ <label for="new-password">كلمة المرور الجديدة</label>
820
+ <input type="password" id="new-password" placeholder="أدخل كلمة المرور الجديدة">
821
+ </div>
822
+ <div class="form-group">
823
+ <label for="confirm-new-password">تأكيد كلمة المرور</label>
824
+ <input type="password" id="confirm-new-password" placeholder="أعد إدخال كلمة المرور">
825
+ </div>
826
+ <button type="submit" class="btn btn-primary">
827
+ <i class="fas fa-key"></i>
828
+ <span>تغيير كلمة المرور</span>
829
+ </button>
830
+ </form>
831
+ <div class="security-options">
832
+ <h3>خيارات إضافية</h3>
833
+ <div class="setting-item">
834
+ <div class="setting-info">
835
+ <h4>المصادقة الثنائية</h4>
836
+ <p>تفعيل المصادقة لحماية إضافية</p>
837
+ </div>
838
+ <label class="toggle-switch">
839
+ <input type="checkbox" id="two-factor">
840
+ <span class="slider"></span>
841
+ </label>
842
+ </div>
843
+ </div>
844
+ </div>
845
+
846
+ <!-- إعدادات اللغة -->
847
+ <div class="settings-panel" id="settings-language">
848
+ <h2>اللغة</h2>
849
+ <div class="settings-options">
850
+ <div class="setting-item">
851
+ <div class="setting-info">
852
+ <h4>لغة الواجهة</h4>
853
+ <p>اختر لغة التطبيق</p>
854
+ </div>
855
+ <select id="interface-language">
856
+ <option value="ar" selected>العربية</option>
857
+ <option value="en">English</option>
858
+ <option value="tr">Türkçe</option>
859
+ </select>
860
+ </div>
861
+ <div class="setting-item">
862
+ <div class="setting-info">
863
+ <h4>اتجاه الكتابة</h4>
864
+ <p>اتجاه النص حسب اللغة</p>
865
+ </div>
866
+ <select id="text-direction">
867
+ <option value="rtl" selected>من اليمين لليسار</option>
868
+ <option value="ltr">من اليسار لليمين</option>
869
+ </select>
870
+ </div>
871
+ </div>
872
+ </div>
873
+ </div>
874
+ </div>
875
+ </section>
876
+ </div>
877
+ </main>
878
+ </div>
879
+
880
+ <!-- النماذج المنبثقة -->
881
+ <!-- نموذج إضافة/تعديل المهمة -->
882
+ <div class="modal" id="task-modal">
883
+ <div class="modal-overlay"></div>
884
+ <div class="modal-content">
885
+ <div class="modal-header">
886
+ <h3 id="task-modal-title">إضافة مهمة جديدة</h3>
887
+ <button class="modal-close" data-modal="task-modal">
888
+ <i class="fas fa-times"></i>
889
+ </button>
890
+ </div>
891
+ <form id="task-form">
892
+ <input type="hidden" id="task-id">
893
+ <div class="form-group">
894
+ <label for="task-title">عنوان المهمة *</label>
895
+ <input type="text" id="task-title" placeholder="أدخل عنوان المهمة" required>
896
+ </div>
897
+ <div class="form-group">
898
+ <label for="task-description">وصف المهمة</label>
899
+ <textarea id="task-description" placeholder="أدخل وصفاً تفصيلياً للمهمة"></textarea>
900
+ </div>
901
+ <div class="form-row">
902
+ <div class="form-group">
903
+ <label for="task-project-select">المشروع *</label>
904
+ <select id="task-project-select" required>
905
+ <option value="">اختر المشروع</option>
906
+ </select>
907
+ </div>
908
+ <div class="form-group">
909
+ <label for="task-priority">الأولوية *</label>
910
+ <select id="task-priority" required>
911
+ <option value="low">منخفضة</option>
912
+ <option value="medium" selected>متوسطة</option>
913
+ <option value="high">عالية</option>
914
+ </select>
915
+ </div>
916
+ </div>
917
+ <div class="form-row">
918
+ <div class="form-group">
919
+ <label for="task-due-date">تاريخ الاستحقاق</label>
920
+ <input type="date" id="task-due-date">
921
+ </div>
922
+ <div class="form-group">
923
+ <label for="task-status">الحالة</label>
924
+ <select id="task-status">
925
+ <option value="pending" selected>قيد الانتظار</option>
926
+ <option value="in-progress">قيد العمل</option>
927
+ <option value="completed">مكتمل</option>
928
+ </select>
929
+ </div>
930
+ </div>
931
+ <div class="form-group">
932
+ <label class="checkbox-label">
933
+ <input type="checkbox" id="task-featured">
934
+ <span>مهمة مميزة</span>
935
+ </label>
936
+ </div>
937
+ <div class="modal-footer">
938
+ <button type="button" class="btn btn-secondary modal-cancel" data-modal="task-modal">إلغاء</button>
939
+ <button type="submit" class="btn btn-primary">
940
+ <i class="fas fa-save"></i>
941
+ <span>حفظ المهمة</span>
942
+ </button>
943
+ </div>
944
+ </form>
945
+ </div>
946
+ </div>
947
+
948
+ <!-- نموذج إضافة/تعديل المشروع -->
949
+ <div class="modal" id="project-modal">
950
+ <div class="modal-overlay"></div>
951
+ <div class="modal-content">
952
+ <div class="modal-header">
953
+ <h3 id="project-modal-title">إنشاء مشروع جديد</h3>
954
+ <button class="modal-close" data-modal="project-modal">
955
+ <i class="fas fa-times"></i>
956
+ </button>
957
+ </div>
958
+ <form id="project-form">
959
+ <input type="hidden" id="project-id">
960
+ <div class="form-group">
961
+ <label for="project-name">اسم المشروع *</label>
962
+ <input type="text" id="project-name" placeholder="أدخل اسم المشروع" required>
963
+ </div>
964
+ <div class="form-group">
965
+ <label for="project-description">وصف المشروع</label>
966
+ <textarea id="project-description" placeholder="أدخل وصفاً للمشروع"></textarea>
967
+ </div>
968
+ <div class="form-row">
969
+ <div class="form-group">
970
+ <label for="project-color">لون المشروع</label>
971
+ <input type="color" id="project-color" value="#4a90d9">
972
+ </div>
973
+ <div class="form-group">
974
+ <label for="project-deadline">تاريخ الانتهاء</label>
975
+ <input type="date" id="project-deadline">
976
+ </div>
977
+ </div>
978
+ <div class="modal-footer">
979
+ <button type="button" class="btn btn-secondary modal-cancel" data-modal="project-modal">إلغاء</button>
980
+ <button type="submit" class="btn btn-primary">
981
+ <i class="fas fa-save"></i>
982
+ <span>حفظ المشروع</span>
983
+ </button>
984
+ </div>
985
+ </form>
986
+ </div>
987
+ </div>
988
+
989
+ <!-- نموذج تفاصيل المهمة -->
990
+ <div class="modal" id="task-details-modal">
991
+ <div class="modal-overlay"></div>
992
+ <div class="modal-content large">
993
+ <div class="modal-header">
994
+ <h3 id="task-details-title">تفاصيل المهمة</h3>
995
+ <button class="modal-close" data-modal="task-details-modal">
996
+ <i class="fas fa-times"></i>
997
+ </button>
998
+ </div>
999
+ <div class="task-details-content" id="task-details-content">
1000
+ <!-- تفاصيل المهمة سيتم إضافتها هنا -->
1001
+ </div>
1002
+ </div>
1003
+ </div>
1004
+
1005
+ <!-- نموذج إضافة عضو للفريق -->
1006
+ <div class="modal" id="invite-modal">
1007
+ <div class="modal-overlay"></div>
1008
+ <div class="modal-content">
1009
+ <div class="modal-header">
1010
+ <h3>دعوة عضو جديد</h3>
1011
+ <button class="modal-close" data-modal="invite-modal">
1012
+ <i class="fas fa-times"></i>
1013
+ </button>
1014
+ </div>
1015
+ <form id="invite-form">
1016
+ <div class="form-group">
1017
+ <label for="invite-email">البريد الإلكتروني</label>
1018
+ <input type="email" id="invite-email" placeholder="أدخل البريد الإلكتروني للدعوة" required>
1019
+ </div>
1020
+ <div class="form-group">
1021
+ <label for="invite-role">الدور</label>
1022
+ <select id="invite-role">
1023
+ <option value="member">عضو</option>
1024
+ <option value="admin">مسؤول</option>
1025
+ <option value="viewer">مشاهد</option>
1026
+ </select>
1027
+ </div>
1028
+ <div class="form-group">
1029
+ <label for="invite-message">رسالة اختيارية</label>
1030
+ <textarea id="invite-message" placeholder="اكتب رسالة مع الدعوة"></textarea>
1031
+ </div>
1032
+ <div class="modal-footer">
1033
+ <button type="button" class="btn btn-secondary modal-cancel" data-modal="invite-modal">إلغاء</button>
1034
+ <button type="submit" class="btn btn-primary">
1035
+ <i class="fas fa-paper-plane"></i>
1036
+ <span>إرسال الدعوة</span>
1037
+ </button>
1038
+ </div>
1039
+ </form>
1040
+ </div>
1041
+ </div>
1042
+
1043
+ <!-- إضافة سريعة للمهمة -->
1044
+ <div class="quick-add-popup hidden" id="quick-add-popup">
1045
+ <div class="quick-add-content">
1046
+ <input type="text" id="quick-task-input" placeholder="أضف مهمة سريعة...">
1047
+ <button class="btn btn-primary" id="quick-task-add">
1048
+ <i class="fas fa-plus"></i>
1049
+ </button>
1050
+ </div>
1051
+ </div>
1052
+
1053
+ <!-- رسائل النجاح والخطأ -->
1054
+ <div class="toast-container" id="toast-container"></div>
1055
+
1056
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
1057
+ <script src="script.js"></script>
1058
+ </body>
1059
+ </html>
script.js ADDED
@@ -0,0 +1,1866 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * TaskFlow Pro - Professional Task Management Application
3
+ * ========================================================
4
+ * Main JavaScript File - Complete Functionality
5
+ * Author: MiniMax Agent
6
+ * Version: 2.0
7
+ */
8
+
9
+ // ============================================
10
+ // التخزين المحلي وإدارة البيانات
11
+ // ============================================
12
+
13
+ const StorageManager = {
14
+ // حفظ البيانات في التخزين المحلي
15
+ save(key, data) {
16
+ try {
17
+ localStorage.setItem(`taskflow_${key}`, JSON.stringify(data));
18
+ return true;
19
+ } catch (error) {
20
+ console.error('خطأ في حفظ البيانات:', error);
21
+ return false;
22
+ }
23
+ },
24
+
25
+ // استرجاع البيانات من التخزين المحلي
26
+ load(key, defaultValue = null) {
27
+ try {
28
+ const data = localStorage.getItem(`taskflow_${key}`);
29
+ return data ? JSON.parse(data) : defaultValue;
30
+ } catch (error) {
31
+ console.error('خطأ في قراءة البيانات:', error);
32
+ return defaultValue;
33
+ }
34
+ },
35
+
36
+ // حذف البيانات
37
+ remove(key) {
38
+ try {
39
+ localStorage.removeItem(`taskflow_${key}`);
40
+ return true;
41
+ } catch (error) {
42
+ console.error('خطأ في حذف البيانات:', error);
43
+ return false;
44
+ }
45
+ },
46
+
47
+ // مسح جميع البيانات
48
+ clearAll() {
49
+ const keys = ['tasks', 'projects', 'team', 'settings', 'user'];
50
+ keys.forEach(key => this.remove(key));
51
+ }
52
+ };
53
+
54
+ // ============================================
55
+ // إدارة الإشعارات
56
+ // ============================================
57
+
58
+ const NotificationManager = {
59
+ notifications: [],
60
+
61
+ init() {
62
+ this.notifications = StorageManager.load('notifications', this.getDefaultNotifications());
63
+ this.render();
64
+ },
65
+
66
+ getDefaultNotifications() {
67
+ return [
68
+ {
69
+ id: 1,
70
+ type: 'task',
71
+ title: 'مهمة جديدة مُضافة',
72
+ message: 'تم إضافة مهمة "تحديث التقرير الأسبوعي" بنجاح',
73
+ time: 'منذ 5 دقائق',
74
+ read: false
75
+ },
76
+ {
77
+ id: 2,
78
+ type: 'comment',
79
+ title: 'تعليق جديد',
80
+ message: 'أحمد علّاش على مهمة "تصميم الواجهة"',
81
+ time: 'منذ ساعة',
82
+ read: false
83
+ },
84
+ {
85
+ id: 3,
86
+ type: 'project',
87
+ title: 'تحديث المشروع',
88
+ message: 'تم تحديث حالة مشروع "تطبيق الجوال"',
89
+ time: 'منذ ساعتين',
90
+ read: false
91
+ }
92
+ ];
93
+ },
94
+
95
+ add(notification) {
96
+ const newNotification = {
97
+ id: Date.now(),
98
+ time: 'الآن',
99
+ read: false,
100
+ ...notification
101
+ };
102
+ this.notifications.unshift(newNotification);
103
+ StorageManager.save('notifications', this.notifications);
104
+ this.render();
105
+ this.updateCount();
106
+ },
107
+
108
+ markAsRead(id) {
109
+ const notification = this.notifications.find(n => n.id === id);
110
+ if (notification) {
111
+ notification.read = true;
112
+ StorageManager.save('notifications', this.notifications);
113
+ this.render();
114
+ this.updateCount();
115
+ }
116
+ },
117
+
118
+ markAllAsRead() {
119
+ this.notifications.forEach(n => n.read = true);
120
+ StorageManager.save('notifications', this.notifications);
121
+ this.render();
122
+ this.updateCount();
123
+ },
124
+
125
+ updateCount() {
126
+ const unreadCount = this.notifications.filter(n => !n.read).length;
127
+ const badge = document.getElementById('notification-count');
128
+ if (badge) {
129
+ badge.textContent = unreadCount;
130
+ badge.style.display = unreadCount > 0 ? 'flex' : 'none';
131
+ }
132
+ },
133
+
134
+ render() {
135
+ const container = document.getElementById('notifications-list');
136
+ if (!container) return;
137
+
138
+ container.innerHTML = this.notifications.map(notification => `
139
+ <div class="notification-item ${notification.read ? '' : 'unread'}" data-id="${notification.id}">
140
+ <div class="notification-icon ${notification.type}">
141
+ <i class="fas fa-${this.getIcon(notification.type)}"></i>
142
+ </div>
143
+ <div class="notification-content">
144
+ <h5>${notification.title}</h5>
145
+ <p>${notification.message}</p>
146
+ <span class="notification-time">${notification.time}</span>
147
+ </div>
148
+ </div>
149
+ `).join('');
150
+
151
+ // إضافة مستمعي الأحداث
152
+ container.querySelectorAll('.notification-item').forEach(item => {
153
+ item.addEventListener('click', () => {
154
+ const id = parseInt(item.dataset.id);
155
+ this.markAsRead(id);
156
+ });
157
+ });
158
+ },
159
+
160
+ getIcon(type) {
161
+ const icons = {
162
+ task: 'tasks',
163
+ comment: 'comment',
164
+ project: 'project-diagram',
165
+ user: 'user'
166
+ };
167
+ return icons[type] || 'bell';
168
+ }
169
+ };
170
+
171
+ // ============================================
172
+ // إدارة المشاريع
173
+ // ============================================
174
+
175
+ const ProjectManager = {
176
+ projects: [],
177
+
178
+ init() {
179
+ this.projects = StorageManager.load('projects', this.getSampleProjects());
180
+ this.renderProjectsList();
181
+ this.renderProjectsGrid();
182
+ this.renderKanbanFilter();
183
+ },
184
+
185
+ getSampleProjects() {
186
+ return [
187
+ {
188
+ id: 1,
189
+ name: 'تطوير تطبيق الجوال',
190
+ description: 'تطوير تطبيق جوال متكامل لادارة المهام والمشاريع',
191
+ color: '#4a90d9',
192
+ deadline: '2025-03-15',
193
+ tasks: [
194
+ { id: 1, title: 'تصميم واجهة المستخدم', status: 'completed' },
195
+ { id: 2, title: 'برمجة الشاشة الرئيسية', status: 'in-progress' },
196
+ { id: 3, title: 'اختبار الأداء', status: 'pending' }
197
+ ]
198
+ },
199
+ {
200
+ id: 2,
201
+ name: 'مشروع الموقع الإلكتروني',
202
+ description: 'إعادة تصميم وتطوير الموقع الإلكتروني للشركة',
203
+ color: '#28a745',
204
+ deadline: '2025-02-28',
205
+ tasks: [
206
+ { id: 4, title: 'تحليل المتطلبات', status: 'completed' },
207
+ { id: 5, title: 'تصميم الهوية البصرية', status: 'completed' }
208
+ ]
209
+ },
210
+ {
211
+ id: 3,
212
+ name: 'حملة التسويق الرقمي',
213
+ description: 'تنفيذ حملة تسويقية شاملة للمنتجات الجديدة',
214
+ color: '#fd7e14',
215
+ deadline: '2025-04-01',
216
+ tasks: [
217
+ { id: 6, title: 'وضع الاستراتيجية', status: 'in-progress' }
218
+ ]
219
+ }
220
+ ];
221
+ },
222
+
223
+ add(project) {
224
+ const newProject = {
225
+ id: Date.now(),
226
+ tasks: [],
227
+ ...project
228
+ };
229
+ this.projects.push(newProject);
230
+ StorageManager.save('projects', this.projects);
231
+ this.renderProjectsList();
232
+ this.renderProjectsGrid();
233
+ this.renderKanbanFilter();
234
+ return newProject;
235
+ },
236
+
237
+ update(id, updates) {
238
+ const index = this.projects.findIndex(p => p.id === id);
239
+ if (index !== -1) {
240
+ this.projects[index] = { ...this.projects[index], ...updates };
241
+ StorageManager.save('projects', this.projects);
242
+ this.renderProjectsList();
243
+ this.renderProjectsGrid();
244
+ this.renderKanbanFilter();
245
+ return true;
246
+ }
247
+ return false;
248
+ },
249
+
250
+ delete(id) {
251
+ this.projects = this.projects.filter(p => p.id !== id);
252
+ StorageManager.save('projects', this.projects);
253
+ this.renderProjectsList();
254
+ this.renderProjectsGrid();
255
+ this.renderKanbanFilter();
256
+ },
257
+
258
+ getProject(id) {
259
+ return this.projects.find(p => p.id === id);
260
+ },
261
+
262
+ getProjectName(id) {
263
+ const project = this.getProject(id);
264
+ return project ? project.name : 'بدون مشروع';
265
+ },
266
+
267
+ renderProjectsList() {
268
+ const select = document.getElementById('task-filter-project');
269
+ const taskProjectSelect = document.getElementById('task-project-select');
270
+ const kanbanFilter = document.getElementById('kanban-project-filter');
271
+
272
+ if (select) {
273
+ select.innerHTML = '<option value="all">جميع المشاريع</option>' +
274
+ this.projects.map(p => `<option value="${p.id}">${p.name}</option>`).join('');
275
+ }
276
+
277
+ if (taskProjectSelect) {
278
+ taskProjectSelect.innerHTML = '<option value="">اختر المشروع</option>' +
279
+ this.projects.map(p => `<option value="${p.id}">${p.name}</option>`).join('');
280
+ }
281
+
282
+ if (kanbanFilter) {
283
+ kanbanFilter.innerHTML = '<option value="all">جميع المشاريع</option>' +
284
+ this.projects.map(p => `<option value="${p.id}">${p.name}</option>`).join('');
285
+ }
286
+ },
287
+
288
+ renderProjectsGrid() {
289
+ const grid = document.getElementById('projects-grid');
290
+ const empty = document.getElementById('empty-projects');
291
+
292
+ if (!grid) return;
293
+
294
+ if (this.projects.length === 0) {
295
+ grid.innerHTML = '';
296
+ if (empty) empty.classList.add('show');
297
+ return;
298
+ }
299
+
300
+ if (empty) empty.classList.remove('show');
301
+
302
+ grid.innerHTML = this.projects.map(project => {
303
+ const completedTasks = project.tasks.filter(t => t.status === 'completed').length;
304
+ const totalTasks = project.tasks.length;
305
+ const progress = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;
306
+
307
+ return `
308
+ <div class="project-card" data-id="${project.id}">
309
+ <div class="project-header">
310
+ <div class="project-color-bar" style="background: linear-gradient(135deg, ${project.color}, ${project.color}dd)"></div>
311
+ <div class="project-actions-overlay">
312
+ <button onclick="ProjectManager.editProject(${project.id})" title="تعديل">
313
+ <i class="fas fa-edit"></i>
314
+ </button>
315
+ <button onclick="ProjectManager.deleteProject(${project.id})" title="حذف">
316
+ <i class="fas fa-trash"></i>
317
+ </button>
318
+ </div>
319
+ </div>
320
+ <div class="project-body">
321
+ <h3 class="project-title">${project.name}</h3>
322
+ <p class="project-description">${project.description || 'لا يوجد وصف'}</p>
323
+ <div class="project-meta">
324
+ <div class="project-progress">
325
+ <div class="project-progress-bar">
326
+ <div class="project-progress-fill" style="width: ${progress}%"></div>
327
+ </div>
328
+ <span class="project-progress-text">${progress}%</span>
329
+ </div>
330
+ <span class="project-tasks-count">${totalTasks} مهام</span>
331
+ </div>
332
+ </div>
333
+ </div>
334
+ `;
335
+ }).join('');
336
+ },
337
+
338
+ renderKanbanFilter() {
339
+ // تم التعامل معه في renderProjectsList
340
+ },
341
+
342
+ editProject(id) {
343
+ const project = this.getProject(id);
344
+ if (!project) return;
345
+
346
+ document.getElementById('project-id').value = id;
347
+ document.getElementById('project-name').value = project.name;
348
+ document.getElementById('project-description').value = project.description || '';
349
+ document.getElementById('project-color').value = project.color;
350
+ document.getElementById('project-deadline').value = project.deadline || '';
351
+ document.getElementById('project-modal-title').textContent = 'تعديل المشروع';
352
+
353
+ ModalManager.open('project-modal');
354
+ },
355
+
356
+ deleteProject(id) {
357
+ if (confirm('هل أنت متأكد من حذف هذا المشروع؟')) {
358
+ this.delete(id);
359
+ ToastManager.show('تم حذف المشروع بنجاح', 'success');
360
+ }
361
+ }
362
+ };
363
+
364
+ // ============================================
365
+ // إدارة المهام
366
+ // ============================================
367
+
368
+ const TaskManager = {
369
+ tasks: [],
370
+
371
+ init() {
372
+ this.tasks = StorageManager.load('tasks', this.getSampleTasks());
373
+ this.renderTasksList();
374
+ this.renderKanbanBoard();
375
+ this.renderDashboard();
376
+ this.renderCalendar();
377
+ },
378
+
379
+ getSampleTasks() {
380
+ return [
381
+ {
382
+ id: 1,
383
+ title: 'إعداد التقرير الأسبوعي',
384
+ description: 'إعداد تقرير شامل عن أداء الفريق خلال الأسبوع',
385
+ projectId: 1,
386
+ priority: 'high',
387
+ status: 'in-progress',
388
+ dueDate: '2025-01-20',
389
+ featured: true,
390
+ createdAt: new Date().toISOString()
391
+ },
392
+ {
393
+ id: 2,
394
+ title: 'مراجعة التصميمات',
395
+ description: 'مراجعة واعتماد التصميمات الجديدة للتطبيق',
396
+ projectId: 1,
397
+ priority: 'medium',
398
+ status: 'pending',
399
+ dueDate: '2025-01-22',
400
+ featured: false,
401
+ createdAt: new Date().toISOString()
402
+ },
403
+ {
404
+ id: 3,
405
+ title: 'اختبار الوظائف',
406
+ description: 'اختبار جميع وظائف التطبيق والتحقق من عدم وجود أخطاء',
407
+ projectId: 1,
408
+ priority: 'high',
409
+ status: 'pending',
410
+ dueDate: '2025-01-25',
411
+ featured: true,
412
+ createdAt: new Date().toISOString()
413
+ },
414
+ {
415
+ id: 4,
416
+ title: 'تحديث الوثائق',
417
+ description: 'تحديث وثائق المستخدم والتطوير',
418
+ projectId: 2,
419
+ priority: 'low',
420
+ status: 'completed',
421
+ dueDate: '2025-01-18',
422
+ featured: false,
423
+ createdAt: new Date().toISOString()
424
+ },
425
+ {
426
+ id: 5,
427
+ title: 'اجتماع مع الفريق',
428
+ description: 'اجتماع أسبوعي لمناقشة التقدم والمشاكل',
429
+ projectId: 2,
430
+ priority: 'medium',
431
+ status: 'pending',
432
+ dueDate: '2025-01-21',
433
+ featured: false,
434
+ createdAt: new Date().toISOString()
435
+ },
436
+ {
437
+ id: 6,
438
+ title: 'إعداد الميزانية',
439
+ description: 'إعداد ميزانية المشروع للربع القادم',
440
+ projectId: 3,
441
+ priority: 'high',
442
+ status: 'in-progress',
443
+ dueDate: '2025-01-23',
444
+ featured: true,
445
+ createdAt: new Date().toISOString()
446
+ }
447
+ ];
448
+ },
449
+
450
+ add(task) {
451
+ const newTask = {
452
+ id: Date.now(),
453
+ status: 'pending',
454
+ createdAt: new Date().toISOString(),
455
+ ...task
456
+ };
457
+ this.tasks.push(newTask);
458
+ StorageManager.save('tasks', this.tasks);
459
+ this.renderAll();
460
+ return newTask;
461
+ },
462
+
463
+ update(id, updates) {
464
+ const index = this.tasks.findIndex(t => t.id === id);
465
+ if (index !== -1) {
466
+ this.tasks[index] = { ...this.tasks[index], ...updates, updatedAt: new Date().toISOString() };
467
+ StorageManager.save('tasks', this.tasks);
468
+ this.renderAll();
469
+ return true;
470
+ }
471
+ return false;
472
+ },
473
+
474
+ delete(id) {
475
+ this.tasks = this.tasks.filter(t => t.id !== id);
476
+ StorageManager.save('tasks', this.tasks);
477
+ this.renderAll();
478
+ },
479
+
480
+ toggleComplete(id) {
481
+ const task = this.tasks.find(t => t.id === id);
482
+ if (task) {
483
+ task.status = task.status === 'completed' ? 'pending' : 'completed';
484
+ StorageManager.save('tasks', this.tasks);
485
+ this.renderAll();
486
+ }
487
+ },
488
+
489
+ getTask(id) {
490
+ return this.tasks.find(t => t.id === id);
491
+ },
492
+
493
+ getFilteredTasks(filters = {}) {
494
+ let filtered = [...this.tasks];
495
+
496
+ if (filters.project && filters.project !== 'all') {
497
+ filtered = filtered.filter(t => t.projectId == filters.project);
498
+ }
499
+
500
+ if (filters.status && filters.status !== 'all') {
501
+ filtered = filtered.filter(t => t.status === filters.status);
502
+ }
503
+
504
+ if (filters.priority && filters.priority !== 'all') {
505
+ filtered = filtered.filter(t => t.priority === filters.priority);
506
+ }
507
+
508
+ return filtered;
509
+ },
510
+
511
+ renderAll() {
512
+ this.renderTasksList();
513
+ this.renderKanbanBoard();
514
+ this.renderDashboard();
515
+ this.renderCalendar();
516
+ },
517
+
518
+ renderTasksList() {
519
+ const container = document.getElementById('tasks-list');
520
+ const empty = document.getElementById('empty-tasks');
521
+
522
+ if (!container) return;
523
+
524
+ const projectFilter = document.getElementById('task-filter-project')?.value || 'all';
525
+ const statusFilter = document.getElementById('task-filter-status')?.value || 'all';
526
+ const priorityFilter = document.getElementById('task-filter-priority')?.value || 'all';
527
+
528
+ const tasks = this.getFilteredTasks({
529
+ project: projectFilter,
530
+ status: statusFilter,
531
+ priority: priorityFilter
532
+ });
533
+
534
+ if (tasks.length === 0) {
535
+ container.innerHTML = '';
536
+ if (empty) empty.classList.add('show');
537
+ return;
538
+ }
539
+
540
+ if (empty) empty.classList.remove('show');
541
+
542
+ container.innerHTML = tasks.map(task => `
543
+ <div class="task-row ${task.status}" data-id="${task.id}">
544
+ <div class="task-checkbox" onclick="TaskManager.toggleComplete(${task.id})">
545
+ ${task.status === 'completed' ? '<i class="fas fa-check"></i>' : ''}
546
+ </div>
547
+ <div class="task-row-title">${task.title}</div>
548
+ <div class="task-project">${ProjectManager.getProjectName(task.projectId)}</div>
549
+ <div class="task-priority">
550
+ <span class="task-priority-badge ${task.priority}">
551
+ ${this.getPriorityLabel(task.priority)}
552
+ </span>
553
+ </div>
554
+ <div class="task-due-date">${this.formatDate(task.dueDate)}</div>
555
+ <div class="task-status">
556
+ <span class="task-priority-badge ${task.status}">
557
+ ${this.getStatusLabel(task.status)}
558
+ </span>
559
+ </div>
560
+ <div class="task-row-actions">
561
+ <button onclick="TaskManager.viewTask(${task.id})" title="عرض">
562
+ <i class="fas fa-eye"></i>
563
+ </button>
564
+ <button onclick="TaskManager.editTask(${task.id})" title="تعديل">
565
+ <i class="fas fa-edit"></i>
566
+ </button>
567
+ <button class="delete" onclick="TaskManager.deleteTask(${task.id})" title="حذف">
568
+ <i class="fas fa-trash"></i>
569
+ </button>
570
+ </div>
571
+ </div>
572
+ `).join('');
573
+ },
574
+
575
+ renderKanbanBoard() {
576
+ const projectFilter = document.getElementById('kanban-project-filter')?.value || 'all';
577
+
578
+ const tasks = this.getFilteredTasks({ project: projectFilter });
579
+
580
+ const columns = {
581
+ pending: document.getElementById('kanban-pending'),
582
+ 'in-progress': document.getElementById('kanban-in-progress'),
583
+ completed: document.getElementById('kanban-completed')
584
+ };
585
+
586
+ Object.keys(columns).forEach(status => {
587
+ if (!columns[status]) return;
588
+
589
+ const statusTasks = tasks.filter(t => t.status === status);
590
+
591
+ columns[status].innerHTML = statusTasks.map(task => `
592
+ <div class="kanban-card" draggable="true" data-id="${task.id}">
593
+ <div class="kanban-card-title">${task.title}</div>
594
+ <div class="kanban-card-meta">
595
+ <span class="kanban-card-project">${ProjectManager.getProjectName(task.projectId)}</span>
596
+ <span class="task-priority-badge ${task.priority}">
597
+ ${this.getPriorityLabel(task.priority)}
598
+ </span>
599
+ </div>
600
+ </div>
601
+ `).join('');
602
+
603
+ // تحديث عداد المهام
604
+ const column = columns[status].closest('.kanban-column');
605
+ if (column) {
606
+ column.querySelector('.task-count').textContent = statusTasks.length;
607
+ }
608
+ });
609
+
610
+ this.initKanbanDragDrop();
611
+ },
612
+
613
+ initKanbanDragDrop() {
614
+ const cards = document.querySelectorAll('.kanban-card');
615
+ const columns = document.querySelectorAll('.column-content');
616
+
617
+ cards.forEach(card => {
618
+ card.addEventListener('dragstart', (e) => {
619
+ card.classList.add('dragging');
620
+ e.dataTransfer.setData('text/plain', card.dataset.id);
621
+ });
622
+
623
+ card.addEventListener('dragend', () => {
624
+ card.classList.remove('dragging');
625
+ });
626
+ });
627
+
628
+ columns.forEach(column => {
629
+ column.addEventListener('dragover', (e) => {
630
+ e.preventDefault();
631
+ const afterElement = this.getDragAfterElement(column, e.clientY);
632
+ const draggable = document.querySelector('.dragging');
633
+ if (afterElement == null) {
634
+ column.appendChild(draggable);
635
+ } else {
636
+ column.insertBefore(draggable, afterElement);
637
+ }
638
+ });
639
+
640
+ column.addEventListener('drop', (e) => {
641
+ e.preventDefault();
642
+ const taskId = parseInt(e.dataTransfer.getData('text/plain'));
643
+ const newStatus = column.id.replace('kanban-', '');
644
+ this.update(taskId, { status: newStatus });
645
+ });
646
+ });
647
+ },
648
+
649
+ getDragAfterElement(container, y) {
650
+ const draggableElements = [...container.querySelectorAll('.kanban-card:not(.dragging)')];
651
+
652
+ return draggableElements.reduce((closest, child) => {
653
+ const box = child.getBoundingClientRect();
654
+ const offset = y - box.top - box.height / 2;
655
+
656
+ if (offset < 0 && offset > closest.offset) {
657
+ return { offset: offset, element: child };
658
+ } else {
659
+ return closest;
660
+ }
661
+ }, { offset: Number.NEGATIVE_INFINITY }).element;
662
+ },
663
+
664
+ renderDashboard() {
665
+ // تحديث الإحصائيات
666
+ const totalTasks = this.tasks.length;
667
+ const completedTasks = this.tasks.filter(t => t.status === 'completed').length;
668
+ const pendingTasks = this.tasks.filter(t => t.status !== 'completed').length;
669
+ const totalProjects = ProjectManager.projects.length;
670
+
671
+ const totalEl = document.getElementById('total-tasks');
672
+ const completedEl = document.getElementById('completed-tasks');
673
+ const pendingEl = document.getElementById('pending-tasks');
674
+ const projectsEl = document.getElementById('total-projects');
675
+
676
+ if (totalEl) totalEl.textContent = totalTasks;
677
+ if (completedEl) completedEl.textContent = completedTasks;
678
+ if (pendingEl) pendingEl.textContent = pendingTasks;
679
+ if (projectsEl) projectsEl.textContent = totalProjects;
680
+
681
+ // تحديث شريط التقدم
682
+ const completionPercentage = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;
683
+ const progressFill = document.getElementById('progress-fill');
684
+ const completionPercent = document.getElementById('completion-percentage');
685
+
686
+ if (progressFill) progressFill.style.width = `${completionPercentage}%`;
687
+ if (completionPercent) completionPercent.textContent = `${completionPercentage}%`;
688
+
689
+ // المهام المميزة
690
+ const featuredTasks = this.tasks.filter(t => t.featured).slice(0, 5);
691
+ const featuredContainer = document.getElementById('featured-tasks');
692
+
693
+ if (featuredContainer) {
694
+ featuredContainer.innerHTML = featuredTasks.map(task => `
695
+ <li class="task-item ${task.status}" onclick="TaskManager.viewTask(${task.id})">
696
+ <div class="task-checkbox" onclick="event.stopPropagation(); TaskManager.toggleComplete(${task.id})">
697
+ ${task.status === 'completed' ? '<i class="fas fa-check"></i>' : ''}
698
+ </div>
699
+ <span class="task-text">${task.title}</span>
700
+ <span class="task-priority-badge ${task.priority}">
701
+ ${this.getPriorityLabel(task.priority)}
702
+ </span>
703
+ </li>
704
+ `).join('');
705
+ }
706
+
707
+ // مهام اليوم
708
+ const today = new Date().toISOString().split('T')[0];
709
+ const todayTasks = this.tasks.filter(t => t.dueDate === today).slice(0, 5);
710
+ const todayContainer = document.getElementById('today-tasks');
711
+
712
+ if (todayContainer) {
713
+ todayContainer.innerHTML = todayTasks.length > 0 ? todayTasks.map(task => `
714
+ <li class="task-item ${task.status}" onclick="TaskManager.viewTask(${task.id})">
715
+ <div class="task-checkbox" onclick="event.stopPropagation(); TaskManager.toggleComplete(${task.id})">
716
+ ${task.status === 'completed' ? '<i class="fas fa-check"></i>' : ''}
717
+ </div>
718
+ <span class="task-text">${task.title}</span>
719
+ </li>
720
+ `).join('') : '<li style="text-align: center; color: var(--text-muted); padding: 20px;">لا توجد مهام اليوم</li>';
721
+ }
722
+
723
+ // توزيع الأولويات
724
+ const highCount = this.tasks.filter(t => t.priority === 'high').length;
725
+ const mediumCount = this.tasks.filter(t => t.priority === 'medium').length;
726
+ const lowCount = this.tasks.filter(t => t.priority === 'low').length;
727
+ const total = highCount + mediumCount + lowCount || 1;
728
+
729
+ const highBar = document.getElementById('high-priority-bar');
730
+ const mediumBar = document.getElementById('medium-priority-bar');
731
+ const lowBar = document.getElementById('low-priority-bar');
732
+
733
+ if (highBar) highBar.style.width = `${(highCount / total) * 100}%`;
734
+ if (mediumBar) mediumBar.style.width = `${(mediumCount / total) * 100}%`;
735
+ if (lowBar) lowBar.style.width = `${(lowCount / total) * 100}%`;
736
+
737
+ document.getElementById('high-priority-count').textContent = highCount;
738
+ document.getElementById('medium-priority-count').textContent = mediumCount;
739
+ document.getElementById('low-priority-count').textContent = lowCount;
740
+ },
741
+
742
+ renderCalendar() {
743
+ const grid = document.getElementById('calendar-grid');
744
+ if (!grid) return;
745
+
746
+ const now = new Date();
747
+ const currentMonth = parseInt(window.currentMonth || now.getMonth());
748
+ const currentYear = parseInt(window.currentYear || now.getFullYear());
749
+
750
+ const monthNames = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو',
751
+ 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'];
752
+
753
+ document.getElementById('current-month').textContent = `${monthNames[currentMonth]} ${currentYear}`;
754
+
755
+ const firstDay = new Date(currentYear, currentMonth, 1).getDay();
756
+ const daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate();
757
+ const daysInPrevMonth = new Date(currentYear, currentMonth, 0).getDate();
758
+
759
+ let html = '';
760
+
761
+ // أيام الشهر السابق
762
+ for (let i = firstDay - 1; i >= 0; i--) {
763
+ html += `<div class="calendar-day other-month"><div class="calendar-day-number">${daysInPrevMonth - i}</div></div>`;
764
+ }
765
+
766
+ // أيام الشهر الحالي
767
+ for (let day = 1; day <= daysInMonth; day++) {
768
+ const dateStr = `${currentYear}-${String(currentMonth + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
769
+ const dayTasks = this.tasks.filter(t => t.dueDate === dateStr);
770
+ const isToday = day === now.getDate() && currentMonth === now.getMonth() && currentYear === now.getFullYear();
771
+
772
+ html += `
773
+ <div class="calendar-day ${isToday ? 'today' : ''}" data-date="${dateStr}">
774
+ <div class="calendar-day-number">${day}</div>
775
+ <div class="calendar-tasks">
776
+ ${dayTasks.slice(0, 2).map(task => `
777
+ <div class="calendar-task ${task.status} ${task.priority}" title="${task.title}">
778
+ ${task.title}
779
+ </div>
780
+ `).join('')}
781
+ ${dayTasks.length > 2 ? `<div class="calendar-task" style="background: var(--bg-tertiary);">+${dayTasks.length - 2} أخرى</div>` : ''}
782
+ </div>
783
+ </div>
784
+ `;
785
+ }
786
+
787
+ // أيام الشهر القادم
788
+ const totalCells = firstDay + daysInMonth;
789
+ const remainingCells = 42 - totalCells;
790
+ for (let i = 1; i <= remainingCells; i++) {
791
+ html += `<div class="calendar-day other-month"><div class="calendar-day-number">${i}</div></div>`;
792
+ }
793
+
794
+ grid.innerHTML = html;
795
+ },
796
+
797
+ formatDate(dateStr) {
798
+ if (!dateStr) return '-';
799
+ const date = new Date(dateStr);
800
+ return date.toLocaleDateString('ar-SA', { day: 'numeric', month: 'short' });
801
+ },
802
+
803
+ getPriorityLabel(priority) {
804
+ const labels = { high: 'عالية', medium: 'متوسطة', low: 'منخفضة' };
805
+ return labels[priority] || priority;
806
+ },
807
+
808
+ getStatusLabel(status) {
809
+ const labels = { pending: 'قيد الانتظار', 'in-progress': 'قيد العمل', completed: 'مكتمل' };
810
+ return labels[status] || status;
811
+ },
812
+
813
+ editTask(id) {
814
+ const task = this.getTask(id);
815
+ if (!task) return;
816
+
817
+ document.getElementById('task-id').value = id;
818
+ document.getElementById('task-title').value = task.title;
819
+ document.getElementById('task-description').value = task.description || '';
820
+ document.getElementById('task-project-select').value = task.projectId || '';
821
+ document.getElementById('task-priority').value = task.priority;
822
+ document.getElementById('task-due-date').value = task.dueDate || '';
823
+ document.getElementById('task-status').value = task.status;
824
+ document.getElementById('task-featured').checked = task.featured || false;
825
+ document.getElementById('task-modal-title').textContent = 'تعديل المهمة';
826
+
827
+ ModalManager.open('task-modal');
828
+ },
829
+
830
+ viewTask(id) {
831
+ const task = this.getTask(id);
832
+ if (!task) return;
833
+
834
+ const content = document.getElementById('task-details-content');
835
+ content.innerHTML = `
836
+ <div class="task-detail-header">
837
+ <h2 class="task-detail-title">${task.title}</h2>
838
+ <span class="task-priority-badge ${task.priority}">${this.getPriorityLabel(task.priority)}</span>
839
+ </div>
840
+ <div class="task-detail-meta">
841
+ <span><i class="fas fa-project-diagram"></i> ${ProjectManager.getProjectName(task.projectId)}</span>
842
+ <span><i class="fas fa-flag"></i> ${this.getPriorityLabel(task.priority)}</span>
843
+ <span><i class="fas fa-calendar"></i> ${this.formatDate(task.dueDate)}</span>
844
+ <span class="task-priority-badge ${task.status}">${this.getStatusLabel(task.status)}</span>
845
+ </div>
846
+ <div class="task-detail-description">
847
+ <h4>الوصف</h4>
848
+ <p>${task.description || 'لا يوجد وصف لهذه المهمة'}</p>
849
+ </div>
850
+ <div class="modal-footer">
851
+ <button class="btn btn-secondary" onclick="ModalManager.close('task-details-modal')">إغلاق</button>
852
+ <button class="btn btn-primary" onclick="TaskManager.editTask(${task.id}); ModalManager.close('task-details-modal');">
853
+ <i class="fas fa-edit"></i>
854
+ <span>تعديل</span>
855
+ </button>
856
+ </div>
857
+ `;
858
+
859
+ ModalManager.open('task-details-modal');
860
+ },
861
+
862
+ deleteTask(id) {
863
+ if (confirm('هل أنت متأكد من حذف هذه المهمة؟')) {
864
+ this.delete(id);
865
+ ToastManager.show('تم حذف المهمة بنجاح', 'success');
866
+ }
867
+ }
868
+ };
869
+
870
+ // ============================================
871
+ // إدارة الفريق
872
+ // ============================================
873
+
874
+ const TeamManager = {
875
+ members: [],
876
+
877
+ init() {
878
+ this.members = StorageManager.load('team', this.getSampleMembers());
879
+ this.renderTeamGrid();
880
+ },
881
+
882
+ getSampleMembers() {
883
+ return [
884
+ {
885
+ id: 1,
886
+ name: 'أحمد محمد',
887
+ role: 'مطور أمامي',
888
+ avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Ahmed',
889
+ tasksCompleted: 45,
890
+ tasksInProgress: 5
891
+ },
892
+ {
893
+ id: 2,
894
+ name: 'سارة علي',
895
+ role: 'مصممة',
896
+ avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Sarah',
897
+ tasksCompleted: 38,
898
+ tasksInProgress: 8
899
+ },
900
+ {
901
+ id: 3,
902
+ name: 'خالد عمر',
903
+ role: 'مطور خلفي',
904
+ avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Khalid',
905
+ tasksCompleted: 52,
906
+ tasksInProgress: 3
907
+ }
908
+ ];
909
+ },
910
+
911
+ add(member) {
912
+ const newMember = {
913
+ id: Date.now(),
914
+ tasksCompleted: 0,
915
+ tasksInProgress: 1,
916
+ ...member
917
+ };
918
+ this.members.push(newMember);
919
+ StorageManager.save('team', this.members);
920
+ this.renderTeamGrid();
921
+ return newMember;
922
+ },
923
+
924
+ renderTeamGrid() {
925
+ const grid = document.getElementById('team-grid');
926
+ const empty = document.getElementById('empty-team');
927
+
928
+ if (!grid) return;
929
+
930
+ if (this.members.length === 0) {
931
+ grid.innerHTML = '';
932
+ if (empty) empty.classList.add('show');
933
+ return;
934
+ }
935
+
936
+ if (empty) empty.classList.remove('show');
937
+
938
+ grid.innerHTML = this.members.map((member, index) => `
939
+ <div class="team-member-card">
940
+ <img src="${member.avatar}" alt="${member.name}" class="member-avatar">
941
+ <h3 class="member-name">${member.name}</h3>
942
+ <p class="member-role">${member.role}</p>
943
+ <div class="member-stats">
944
+ <div class="member-stat">
945
+ <div class="member-stat-value">${member.tasksCompleted}</div>
946
+ <div class="member-stat-label">مهام مكتملة</div>
947
+ </div>
948
+ <div class="member-stat">
949
+ <div class="member-stat-value">${member.tasksInProgress}</div>
950
+ <div class="member-stat-label">قيد العمل</div>
951
+ </div>
952
+ </div>
953
+ </div>
954
+ `).join('');
955
+
956
+ // تحديث أفضل الأعضاء في التحليلات
957
+ this.renderTopPerformers();
958
+ },
959
+
960
+ renderTopPerformers() {
961
+ const container = document.getElementById('top-performers');
962
+ if (!container) return;
963
+
964
+ const sorted = [...this.members].sort((a, b) => b.tasksCompleted - a.tasksCompleted).slice(0, 5);
965
+
966
+ container.innerHTML = sorted.map((member, index) => `
967
+ <div class="performer-item">
968
+ <div class="performer-rank ${index === 0 ? 'gold' : index === 1 ? 'silver' : index === 2 ? 'bronze' : ''}">
969
+ ${index + 1}
970
+ </div>
971
+ <div class="performer-info">
972
+ <div class="performer-name">${member.name}</div>
973
+ <div class="performer-tasks">${member.tasksCompleted} مهمة مكتملة</div>
974
+ </div>
975
+ </div>
976
+ `).join('');
977
+ }
978
+ };
979
+
980
+ // ============================================
981
+ // إدارة النماذج المنبثقة
982
+ // ============================================
983
+
984
+ const ModalManager = {
985
+ open(modalId) {
986
+ const modal = document.getElementById(modalId);
987
+ if (modal) {
988
+ modal.classList.add('active');
989
+ document.body.style.overflow = 'hidden';
990
+ }
991
+ },
992
+
993
+ close(modalId) {
994
+ const modal = document.getElementById(modalId);
995
+ if (modal) {
996
+ modal.classList.remove('active');
997
+ document.body.style.overflow = '';
998
+ }
999
+ },
1000
+
1001
+ init() {
1002
+ // إغلاق النماذج عند النقر على Overlay
1003
+ document.querySelectorAll('.modal-overlay').forEach(overlay => {
1004
+ overlay.addEventListener('click', () => {
1005
+ const modal = overlay.closest('.modal');
1006
+ if (modal) {
1007
+ this.close(modal.id);
1008
+ }
1009
+ });
1010
+ });
1011
+
1012
+ // إغلاق النماذج عند النقر على زر الإغلاق
1013
+ document.querySelectorAll('.modal-close, .modal-cancel').forEach(btn => {
1014
+ btn.addEventListener('click', () => {
1015
+ const modalId = btn.dataset.modal;
1016
+ if (modalId) {
1017
+ this.close(modalId);
1018
+ }
1019
+ });
1020
+ });
1021
+
1022
+ // Escape لإغلاق النماذج
1023
+ document.addEventListener('keydown', (e) => {
1024
+ if (e.key === 'Escape') {
1025
+ document.querySelectorAll('.modal.active').forEach(modal => {
1026
+ this.close(modal.id);
1027
+ });
1028
+ }
1029
+ });
1030
+ }
1031
+ };
1032
+
1033
+ // ============================================
1034
+ // إدارة رسائل التنبيه
1035
+ // ============================================
1036
+
1037
+ const ToastManager = {
1038
+ show(message, type = 'info', duration = 3000) {
1039
+ const container = document.getElementById('toast-container');
1040
+ if (!container) return;
1041
+
1042
+ const toast = document.createElement('div');
1043
+ toast.className = `toast ${type}`;
1044
+
1045
+ const icons = {
1046
+ success: 'check-circle',
1047
+ error: 'times-circle',
1048
+ warning: 'exclamation-triangle',
1049
+ info: 'info-circle'
1050
+ };
1051
+
1052
+ toast.innerHTML = `
1053
+ <i class="fas fa-${icons[type]} toast-icon"></i>
1054
+ <span class="toast-message">${message}</span>
1055
+ `;
1056
+
1057
+ container.appendChild(toast);
1058
+
1059
+ setTimeout(() => {
1060
+ toast.style.animation = 'toastSlideIn 0.3s ease reverse';
1061
+ setTimeout(() => toast.remove(), 300);
1062
+ }, duration);
1063
+ }
1064
+ };
1065
+
1066
+ // ============================================
1067
+ // إدارة الإعدادات
1068
+ // ============================================
1069
+
1070
+ const SettingsManager = {
1071
+ settings: {},
1072
+
1073
+ init() {
1074
+ this.settings = StorageManager.load('settings', {
1075
+ darkMode: false,
1076
+ primaryColor: 'blue',
1077
+ fontSize: 'medium',
1078
+ language: 'ar',
1079
+ notifications: {
1080
+ newTask: true,
1081
+ dueDate: true,
1082
+ comments: true,
1083
+ email: false
1084
+ }
1085
+ });
1086
+
1087
+ this.applySettings();
1088
+ this.setupEventListeners();
1089
+ },
1090
+
1091
+ save() {
1092
+ StorageManager.save('settings', this.settings);
1093
+ },
1094
+
1095
+ applySettings() {
1096
+ // الوضع الداكن
1097
+ if (this.settings.darkMode) {
1098
+ document.body.setAttribute('data-theme', 'dark');
1099
+ document.getElementById('dark-mode-toggle').checked = true;
1100
+ } else {
1101
+ document.body.removeAttribute('data-theme');
1102
+ document.getElementById('dark-mode-toggle').checked = false;
1103
+ }
1104
+
1105
+ // اللون الرئيسي
1106
+ document.body.setAttribute('data-color', this.settings.primaryColor);
1107
+ document.querySelectorAll('.color-option').forEach(btn => {
1108
+ btn.classList.toggle('active', btn.dataset.color === this.settings.primaryColor);
1109
+ });
1110
+
1111
+ // حجم الخط
1112
+ document.body.setAttribute('data-font-size', this.settings.fontSize);
1113
+ document.getElementById('font-size').value = this.settings.fontSize;
1114
+
1115
+ // اللغة
1116
+ document.getElementById('interface-language').value = this.settings.language;
1117
+ document.getElementById('text-direction').value = this.settings.language === 'ar' ? 'rtl' : 'ltr';
1118
+
1119
+ // الإشعارات
1120
+ if (document.getElementById('notify-new-task')) {
1121
+ document.getElementById('notify-new-task').checked = this.settings.notifications.newTask;
1122
+ }
1123
+ if (document.getElementById('notify-due-date')) {
1124
+ document.getElementById('notify-due-date').checked = this.settings.notifications.dueDate;
1125
+ }
1126
+ if (document.getElementById('notify-comments')) {
1127
+ document.getElementById('notify-comments').checked = this.settings.notifications.comments;
1128
+ }
1129
+ if (document.getElementById('notify-email')) {
1130
+ document.getElementById('notify-email').checked = this.settings.notifications.email;
1131
+ }
1132
+
1133
+ // بيانات المستخدم
1134
+ const user = StorageManager.load('user', {});
1135
+ if (user.name) {
1136
+ document.getElementById('settings-name').value = user.name;
1137
+ document.getElementById('user-name').textContent = user.name;
1138
+ }
1139
+ if (user.email) {
1140
+ document.getElementById('settings-email').value = user.email;
1141
+ }
1142
+ },
1143
+
1144
+ setupEventListeners() {
1145
+ // الوضع الداكن
1146
+ document.getElementById('dark-mode-toggle')?.addEventListener('change', (e) => {
1147
+ this.settings.darkMode = e.target.checked;
1148
+ this.applySettings();
1149
+ this.save();
1150
+ });
1151
+
1152
+ // الألوان
1153
+ document.querySelectorAll('.color-option').forEach(btn => {
1154
+ btn.addEventListener('click', () => {
1155
+ this.settings.primaryColor = btn.dataset.color;
1156
+ this.applySettings();
1157
+ this.save();
1158
+ ToastManager.show('تم تغيير اللون بنجاح', 'success');
1159
+ });
1160
+ });
1161
+
1162
+ // حجم الخط
1163
+ document.getElementById('font-size')?.addEventListener('change', (e) => {
1164
+ this.settings.fontSize = e.target.value;
1165
+ this.applySettings();
1166
+ this.save();
1167
+ });
1168
+
1169
+ // اللغة
1170
+ document.getElementById('interface-language')?.addEventListener('change', (e) => {
1171
+ this.settings.language = e.target.value;
1172
+ this.applySettings();
1173
+ this.save();
1174
+ ToastManager.show('يرجى إعادة تحميل الصفحة لتطبيق التغييرات', 'info');
1175
+ });
1176
+
1177
+ // الإشعارات
1178
+ document.getElementById('notify-new-task')?.addEventListener('change', (e) => {
1179
+ this.settings.notifications.newTask = e.target.checked;
1180
+ this.save();
1181
+ });
1182
+
1183
+ document.getElementById('notify-due-date')?.addEventListener('change', (e) => {
1184
+ this.settings.notifications.dueDate = e.target.checked;
1185
+ this.save();
1186
+ });
1187
+
1188
+ document.getElementById('notify-comments')?.addEventListener('change', (e) => {
1189
+ this.settings.notifications.comments = e.target.checked;
1190
+ this.save();
1191
+ });
1192
+
1193
+ document.getElementById('notify-email')?.addEventListener('change', (e) => {
1194
+ this.settings.notifications.email = e.target.checked;
1195
+ this.save();
1196
+ });
1197
+
1198
+ // نموذج الملف الشخصي
1199
+ document.getElementById('profile-form')?.addEventListener('submit', (e) => {
1200
+ e.preventDefault();
1201
+ const user = {
1202
+ name: document.getElementById('settings-name').value,
1203
+ email: document.getElementById('settings-email').value,
1204
+ phone: document.getElementById('settings-phone').value,
1205
+ bio: document.getElementById('settings-bio').value
1206
+ };
1207
+ StorageManager.save('user', user);
1208
+ document.getElementById('user-name').textContent = user.name || 'مستخدم جديد';
1209
+ ToastManager.show('تم حفظ التغييرات بنجاح', 'success');
1210
+ });
1211
+
1212
+ // نموذج كلمة المرور
1213
+ document.getElementById('security-form')?.addEventListener('submit', (e) => {
1214
+ e.preventDefault();
1215
+ const current = document.getElementById('current-password').value;
1216
+ const newPass = document.getElementById('new-password').value;
1217
+ const confirm = document.getElementById('confirm-new-password').value;
1218
+
1219
+ if (!current) {
1220
+ ToastManager.show('الرجاء إدخال كلمة المرور الحالية', 'error');
1221
+ return;
1222
+ }
1223
+
1224
+ if (newPass !== confirm) {
1225
+ ToastManager.show('كلمتا المرور غير متطابقتين', 'error');
1226
+ return;
1227
+ }
1228
+
1229
+ if (newPass.length < 6) {
1230
+ ToastManager.show('كلمة المرور يجب أن تكون 6 أحرف على الأقل', 'error');
1231
+ return;
1232
+ }
1233
+
1234
+ ToastManager.show('تم تغيير كلمة المرور بنجاح', 'success');
1235
+ e.target.reset();
1236
+ });
1237
+
1238
+ // قوائم الإعدادات
1239
+ document.querySelectorAll('.settings-sidebar li').forEach(item => {
1240
+ item.addEventListener('click', () => {
1241
+ const settingsId = item.dataset.settings;
1242
+
1243
+ document.querySelectorAll('.settings-sidebar li').forEach(li => li.classList.remove('active'));
1244
+ document.querySelectorAll('.settings-panel').forEach(panel => panel.classList.remove('active'));
1245
+
1246
+ item.classList.add('active');
1247
+ document.getElementById(`settings-${settingsId}`)?.classList.add('active');
1248
+ });
1249
+ });
1250
+ }
1251
+ };
1252
+
1253
+ // ============================================
1254
+ // إدارة المصادقة
1255
+ // ============================================
1256
+
1257
+ const AuthManager = {
1258
+ user: null,
1259
+
1260
+ init() {
1261
+ this.user = StorageManager.load('currentUser', null);
1262
+
1263
+ if (this.user) {
1264
+ this.showMainApp();
1265
+ } else {
1266
+ this.showLoginPage();
1267
+ }
1268
+
1269
+ this.setupEventListeners();
1270
+ },
1271
+
1272
+ login(email, password) {
1273
+ // محاكاة تسجيل الدخول
1274
+ if (email && password.length >= 6) {
1275
+ this.user = {
1276
+ email: email,
1277
+ name: email.split('@')[0],
1278
+ avatar: `https://api.dicebear.com/7.x/avataaars/svg?seed=${email}`
1279
+ };
1280
+ StorageManager.save('currentUser', this.user);
1281
+ this.showMainApp();
1282
+ ToastManager.show('مرحباً بعودتك!', 'success');
1283
+ return true;
1284
+ }
1285
+ ToastManager.show('البريد الإلكتروني أو كلمة المرور غير صحيحة', 'error');
1286
+ return false;
1287
+ },
1288
+
1289
+ register(name, email, password) {
1290
+ if (name && email && password.length >= 6) {
1291
+ this.user = {
1292
+ name: name,
1293
+ email: email,
1294
+ avatar: `https://api.dicebear.com/7.x/avataaars/svg?seed=${name}`
1295
+ };
1296
+ StorageManager.save('currentUser', this.user);
1297
+ this.showMainApp();
1298
+ ToastManager.show('تم إنشاء حسابك بنجاح!', 'success');
1299
+ return true;
1300
+ }
1301
+ ToastManager.show('الرجاء تعبئة جميع الحقول بشكل صحيح', 'error');
1302
+ return false;
1303
+ },
1304
+
1305
+ logout() {
1306
+ this.user = null;
1307
+ StorageManager.remove('currentUser');
1308
+ this.showLoginPage();
1309
+ ToastManager.show('تم تسجيل الخروج بنجاح', 'info');
1310
+ },
1311
+
1312
+ showLoginPage() {
1313
+ document.getElementById('login-page').classList.remove('hidden');
1314
+ document.getElementById('main-app').classList.add('hidden');
1315
+ document.getElementById('loading-screen').classList.add('hidden');
1316
+ },
1317
+
1318
+ showMainApp() {
1319
+ document.getElementById('login-page').classList.add('hidden');
1320
+ document.getElementById('main-app').classList.remove('hidden');
1321
+ document.getElementById('loading-screen').classList.add('hidden');
1322
+
1323
+ if (this.user) {
1324
+ document.getElementById('user-name').textContent = this.user.name || 'مستخدم جديد';
1325
+ }
1326
+ },
1327
+
1328
+ setupEventListeners() {
1329
+ // نموذج تسجيل الدخول
1330
+ document.getElementById('login-form')?.addEventListener('submit', (e) => {
1331
+ e.preventDefault();
1332
+ const email = document.getElementById('login-email').value;
1333
+ const password = document.getElementById('login-password').value;
1334
+ this.login(email, password);
1335
+ });
1336
+
1337
+ // نموذج التسجيل
1338
+ document.getElementById('register-form')?.addEventListener('submit', (e) => {
1339
+ e.preventDefault();
1340
+ const name = document.getElementById('register-name').value;
1341
+ const email = document.getElementById('register-email').value;
1342
+ const password = document.getElementById('register-password').value;
1343
+ const confirm = document.getElementById('register-confirm').value;
1344
+
1345
+ if (password !== confirm) {
1346
+ ToastManager.show('كلمتا المرور غير متطابقتين', 'error');
1347
+ return;
1348
+ }
1349
+
1350
+ this.register(name, email, password);
1351
+ });
1352
+
1353
+ // التبديل بين تسجيل الدخول والتسجيل
1354
+ document.getElementById('show-register')?.addEventListener('click', (e) => {
1355
+ e.preventDefault();
1356
+ document.getElementById('login-form').classList.add('hidden');
1357
+ document.getElementById('register-form').classList.remove('hidden');
1358
+ });
1359
+
1360
+ document.getElementById('show-login')?.addEventListener('click', (e) => {
1361
+ e.preventDefault();
1362
+ document.getElementById('register-form').classList.add('hidden');
1363
+ document.getElementById('login-form').classList.remove('hidden');
1364
+ });
1365
+
1366
+ // تسجيل الخروج
1367
+ document.getElementById('logout-btn')?.addEventListener('click', (e) => {
1368
+ e.preventDefault();
1369
+ this.logout();
1370
+ });
1371
+
1372
+ // تسجيل الخروج من قائمة المستخدم
1373
+ document.querySelectorAll('[data-action="logout"]').forEach(btn => {
1374
+ btn.addEventListener('click', (e) => {
1375
+ e.preventDefault();
1376
+ this.logout();
1377
+ });
1378
+ });
1379
+
1380
+ // الانتقال إلى الإعدادات من قائمة المستخدم
1381
+ document.querySelector('[data-action="settings"]')?.addEventListener('click', (e) => {
1382
+ e.preventDefault();
1383
+ this.switchView('settings');
1384
+ });
1385
+ },
1386
+
1387
+ switchView(viewName) {
1388
+ document.querySelectorAll('.view').forEach(v => v.classList.remove('active'));
1389
+ document.querySelectorAll('.sidebar-nav li').forEach(l => l.classList.remove('active'));
1390
+
1391
+ const view = document.getElementById(`${viewName}-view`);
1392
+ const navItem = document.querySelector(`.sidebar-nav li[data-view="${viewName}"]`);
1393
+
1394
+ if (view) view.classList.add('active');
1395
+ if (navItem) navItem.classList.add('active');
1396
+
1397
+ // إغلاق القائمة المنسدلة
1398
+ document.getElementById('user-menu')?.classList.remove('active');
1399
+ }
1400
+ };
1401
+
1402
+ // ============================================
1403
+ // إدارة التنقل وال��رض
1404
+ // ============================================
1405
+
1406
+ const NavigationManager = {
1407
+ init() {
1408
+ // التنقل في الشريط الجانبي
1409
+ document.querySelectorAll('.sidebar-nav li, .sidebar-footer li').forEach(item => {
1410
+ item.addEventListener('click', (e) => {
1411
+ e.preventDefault();
1412
+ const viewName = item.dataset.view;
1413
+ if (viewName) {
1414
+ this.switchView(viewName);
1415
+ }
1416
+ });
1417
+ });
1418
+
1419
+ // قائمة المستخدم
1420
+ document.getElementById('user-btn')?.addEventListener('click', () => {
1421
+ document.getElementById('user-menu')?.classList.toggle('active');
1422
+ });
1423
+
1424
+ // قائمة الإشعارات
1425
+ document.getElementById('notifications-btn')?.addEventListener('click', () => {
1426
+ document.getElementById('notifications-menu')?.classList.toggle('active');
1427
+ });
1428
+
1429
+ // تعليم جميع الإشعارات كمقروءة
1430
+ document.querySelector('.mark-all-read')?.addEventListener('click', () => {
1431
+ NotificationManager.markAllAsRead();
1432
+ ToastManager.show('تم تعليم جميع الإشعارات كمقروءة', 'success');
1433
+ });
1434
+
1435
+ // تبديل الشريط الجانبي
1436
+ document.getElementById('sidebar-toggle')?.addEventListener('click', () => {
1437
+ document.getElementById('sidebar').classList.toggle('collapsed');
1438
+ document.body.classList.toggle('sidebar-collapsed');
1439
+ });
1440
+
1441
+ // قائمة الجوال
1442
+ document.getElementById('menu-toggle')?.addEventListener('click', () => {
1443
+ document.getElementById('sidebar').classList.toggle('active');
1444
+ });
1445
+
1446
+ // إغلاق القوائم عند النقر خارجها
1447
+ document.addEventListener('click', (e) => {
1448
+ if (!e.target.closest('.user-dropdown')) {
1449
+ document.getElementById('user-menu')?.classList.remove('active');
1450
+ }
1451
+ if (!e.target.closest('.notifications-dropdown')) {
1452
+ document.getElementById('notifications-menu')?.classList.remove('active');
1453
+ }
1454
+ if (!e.target.closest('.sidebar') && !e.target.closest('.menu-toggle')) {
1455
+ document.getElementById('sidebar')?.classList.remove('active');
1456
+ }
1457
+ });
1458
+
1459
+ // فلاتر المهام
1460
+ document.getElementById('task-filter-project')?.addEventListener('change', () => {
1461
+ TaskManager.renderTasksList();
1462
+ });
1463
+
1464
+ document.getElementById('task-filter-status')?.addEventListener('change', () => {
1465
+ TaskManager.renderTasksList();
1466
+ });
1467
+
1468
+ document.getElementById('task-filter-priority')?.addEventListener('change', () => {
1469
+ TaskManager.renderTasksList();
1470
+ });
1471
+
1472
+ // فلتر كانبان
1473
+ document.getElementById('kanban-project-filter')?.addEventListener('change', () => {
1474
+ TaskManager.renderKanbanBoard();
1475
+ });
1476
+
1477
+ // أزرار "عرض الكل"
1478
+ document.querySelectorAll('.view-all').forEach(btn => {
1479
+ btn.addEventListener('click', (e) => {
1480
+ e.preventDefault();
1481
+ const view = btn.dataset.view;
1482
+ if (view) {
1483
+ this.switchView(view);
1484
+ }
1485
+ });
1486
+ });
1487
+ },
1488
+
1489
+ switchView(viewName) {
1490
+ document.querySelectorAll('.view').forEach(v => v.classList.remove('active'));
1491
+ document.querySelectorAll('.sidebar-nav li').forEach(l => l.classList.remove('active'));
1492
+
1493
+ const view = document.getElementById(`${viewName}-view`);
1494
+ const navItem = document.querySelector(`.sidebar-nav li[data-view="${viewName}"]`);
1495
+
1496
+ if (view) {
1497
+ view.classList.add('active');
1498
+ this.updateViewTitle(viewName);
1499
+ }
1500
+
1501
+ if (navItem) navItem.classList.add('active');
1502
+
1503
+ // تهيئة التقويم إذا تم عرضه
1504
+ if (viewName === 'calendar') {
1505
+ TaskManager.renderCalendar();
1506
+ }
1507
+ },
1508
+
1509
+ updateViewTitle(viewName) {
1510
+ const titles = {
1511
+ dashboard: 'لوحة التحكم',
1512
+ tasks: 'المهام',
1513
+ projects: 'المشاريع',
1514
+ kanban: 'لوحة كانبان',
1515
+ calendar: 'التقويم',
1516
+ team: 'الفريق',
1517
+ analytics: 'التحليلات',
1518
+ settings: 'الإعدادات'
1519
+ };
1520
+
1521
+ const viewHeader = document.querySelector('#dashboard-view.active .view-header h1');
1522
+ if (viewHeader && titles[viewName]) {
1523
+ viewHeader.textContent = titles[viewName];
1524
+ }
1525
+ }
1526
+ };
1527
+
1528
+ // ============================================
1529
+ // إدارة النماذج
1530
+ // ============================================
1531
+
1532
+ const FormManager = {
1533
+ init() {
1534
+ // نموذج المهمة
1535
+ document.getElementById('task-form')?.addEventListener('submit', (e) => {
1536
+ e.preventDefault();
1537
+
1538
+ const taskData = {
1539
+ title: document.getElementById('task-title').value,
1540
+ description: document.getElementById('task-description').value,
1541
+ projectId: parseInt(document.getElementById('task-project-select').value) || null,
1542
+ priority: document.getElementById('task-priority').value,
1543
+ dueDate: document.getElementById('task-due-date').value,
1544
+ status: document.getElementById('task-status').value,
1545
+ featured: document.getElementById('task-featured').checked
1546
+ };
1547
+
1548
+ const taskId = document.getElementById('task-id').value;
1549
+
1550
+ if (taskId) {
1551
+ TaskManager.update(parseInt(taskId), taskData);
1552
+ ToastManager.show('تم تحديث المهمة بنجاح', 'success');
1553
+ } else {
1554
+ TaskManager.add(taskData);
1555
+ ToastManager.show('تم إضافة المهمة بنجاح', 'success');
1556
+ }
1557
+
1558
+ ModalManager.close('task-modal');
1559
+ e.target.reset();
1560
+ });
1561
+
1562
+ // نموذج المشروع
1563
+ document.getElementById('project-form')?.addEventListener('submit', (e) => {
1564
+ e.preventDefault();
1565
+
1566
+ const projectData = {
1567
+ name: document.getElementById('project-name').value,
1568
+ description: document.getElementById('project-description').value,
1569
+ color: document.getElementById('project-color').value,
1570
+ deadline: document.getElementById('project-deadline').value
1571
+ };
1572
+
1573
+ const projectId = document.getElementById('project-id').value;
1574
+
1575
+ if (projectId) {
1576
+ ProjectManager.update(parseInt(projectId), projectData);
1577
+ ToastManager.show('تم تحديث المشروع بنجاح', 'success');
1578
+ } else {
1579
+ ProjectManager.add(projectData);
1580
+ ToastManager.show('تم إنشاء المشروع بنجاح', 'success');
1581
+ }
1582
+
1583
+ ModalManager.close('project-modal');
1584
+ e.target.reset();
1585
+ });
1586
+
1587
+ // نموذج دعوة عضو
1588
+ document.getElementById('invite-form')?.addEventListener('submit', (e) => {
1589
+ e.preventDefault();
1590
+
1591
+ const inviteData = {
1592
+ email: document.getElementById('invite-email').value,
1593
+ role: document.getElementById('invite-role').value
1594
+ };
1595
+
1596
+ // محاكاة إرسال الدعوة
1597
+ ToastManager.show(`تم إرسال الدعوة إلى ${inviteData.email}`, 'success');
1598
+ ModalManager.close('invite-modal');
1599
+ e.target.reset();
1600
+ });
1601
+ }
1602
+ };
1603
+
1604
+ // ============================================
1605
+ // إدارة الأزرار والإجراءات
1606
+ // ============================================
1607
+
1608
+ const ActionManager = {
1609
+ init() {
1610
+ // إضافة مهمة جديدة
1611
+ document.getElementById('new-task-btn')?.addEventListener('click', () => this.openTaskModal());
1612
+ document.getElementById('add-task-btn')?.addEventListener('click', () => this.openTaskModal());
1613
+ document.getElementById('empty-add-task')?.addEventListener('click', () => this.openTaskModal());
1614
+ document.getElementById('quick-add')?.addEventListener('click', () => this.toggleQuickAdd());
1615
+
1616
+ // إضافة مهمة سريعة
1617
+ document.getElementById('quick-task-add')?.addEventListener('click', () => this.addQuickTask());
1618
+ document.getElementById('quick-task-input')?.addEventListener('keypress', (e) => {
1619
+ if (e.key === 'Enter') this.addQuickTask();
1620
+ });
1621
+
1622
+ // إضافة مشروع جديد
1623
+ document.getElementById('add-project-btn')?.addEventListener('click', () => this.openProjectModal());
1624
+ document.getElementById('empty-add-project')?.addEventListener('click', () => this.openProjectModal());
1625
+
1626
+ // دعوة عضو للفريق
1627
+ document.getElementById('invite-member-btn')?.addEventListener('click', () => {
1628
+ ModalManager.open('invite-modal');
1629
+ });
1630
+ document.getElementById('empty-invite')?.addEventListener('click', () => {
1631
+ ModalManager.open('invite-modal');
1632
+ });
1633
+
1634
+ // إضافة مهمة لعمود كانبان
1635
+ document.querySelectorAll('.add-task-to-column').forEach(btn => {
1636
+ btn.addEventListener('click', () => {
1637
+ const status = btn.dataset.status;
1638
+ document.getElementById('task-status').value = status;
1639
+ this.openTaskModal();
1640
+ });
1641
+ });
1642
+
1643
+ // التنقل في التقويم
1644
+ document.getElementById('calendar-prev')?.addEventListener('click', () => this.navigateCalendar(-1));
1645
+ document.getElementById('calendar-next')?.addEventListener('click', () => this.navigateCalendar(1));
1646
+ document.getElementById('today-btn')?.addEventListener('click', () => {
1647
+ window.currentMonth = new Date().getMonth();
1648
+ window.currentYear = new Date().getFullYear();
1649
+ TaskManager.renderCalendar();
1650
+ });
1651
+
1652
+ // ملء بيانات الاختبار
1653
+ document.getElementById('google-login')?.addEventListener('click', () => {
1654
+ AuthManager.login('demo@gmail.com', '123456');
1655
+ });
1656
+
1657
+ document.getElementById('github-login')?.addEventListener('click', () => {
1658
+ AuthManager.login('demo@github.com', '123456');
1659
+ });
1660
+ },
1661
+
1662
+ openTaskModal() {
1663
+ document.getElementById('task-id').value = '';
1664
+ document.getElementById('task-form').reset();
1665
+ document.getElementById('task-modal-title').textContent = 'إضافة مهمة جديدة';
1666
+ ModalManager.open('task-modal');
1667
+ },
1668
+
1669
+ openProjectModal() {
1670
+ document.getElementById('project-id').value = '';
1671
+ document.getElementById('project-form').reset();
1672
+ document.getElementById('project-modal-title').textContent = 'إنشاء مشروع جديد';
1673
+ ModalManager.open('project-modal');
1674
+ },
1675
+
1676
+ toggleQuickAdd() {
1677
+ const popup = document.getElementById('quick-add-popup');
1678
+ popup?.classList.toggle('hidden');
1679
+ if (!popup?.classList.contains('hidden')) {
1680
+ document.getElementById('quick-task-input')?.focus();
1681
+ }
1682
+ },
1683
+
1684
+ addQuickTask() {
1685
+ const input = document.getElementById('quick-task-input');
1686
+ const title = input.value.trim();
1687
+
1688
+ if (title) {
1689
+ TaskManager.add({
1690
+ title: title,
1691
+ priority: 'medium',
1692
+ projectId: ProjectManager.projects[0]?.id || null
1693
+ });
1694
+ ToastManager.show('تم إضافة المهمة', 'success');
1695
+ input.value = '';
1696
+ }
1697
+ },
1698
+
1699
+ navigateCalendar(direction) {
1700
+ const now = new Date();
1701
+ const currentMonth = parseInt(window.currentMonth || now.getMonth());
1702
+ const currentYear = parseInt(window.currentYear || now.getFullYear());
1703
+
1704
+ let newMonth = currentMonth + direction;
1705
+ let newYear = currentYear;
1706
+
1707
+ if (newMonth > 11) {
1708
+ newMonth = 0;
1709
+ newYear++;
1710
+ } else if (newMonth < 0) {
1711
+ newMonth = 11;
1712
+ newYear--;
1713
+ }
1714
+
1715
+ window.currentMonth = newMonth;
1716
+ window.currentYear = newYear;
1717
+ TaskManager.renderCalendar();
1718
+ }
1719
+ };
1720
+
1721
+ // ============================================
1722
+ // إدارة الرسوم البيانية
1723
+ // ============================================
1724
+
1725
+ const ChartManager = {
1726
+ charts: {},
1727
+
1728
+ init() {
1729
+ this.renderTasksChart();
1730
+ this.renderPriorityChart();
1731
+ },
1732
+
1733
+ renderTasksChart() {
1734
+ const ctx = document.getElementById('tasks-chart');
1735
+ if (!ctx) return;
1736
+
1737
+ const tasks = TaskManager.tasks;
1738
+ const completed = tasks.filter(t => t.status === 'completed').length;
1739
+ const inProgress = tasks.filter(t => t.status === 'in-progress').length;
1740
+ const pending = tasks.filter(t => t.status === 'pending').length;
1741
+
1742
+ if (this.charts.tasks) {
1743
+ this.charts.tasks.destroy();
1744
+ }
1745
+
1746
+ this.charts.tasks = new Chart(ctx, {
1747
+ type: 'bar',
1748
+ data: {
1749
+ labels: ['مكتمل', 'قيد العمل', 'قيد الانتظار'],
1750
+ datasets: [{
1751
+ label: 'عدد المهام',
1752
+ data: [completed, inProgress, pending],
1753
+ backgroundColor: ['#28a745', '#4a90d9', '#ffc107'],
1754
+ borderRadius: 8
1755
+ }]
1756
+ },
1757
+ options: {
1758
+ responsive: true,
1759
+ maintainAspectRatio: false,
1760
+ plugins: {
1761
+ legend: {
1762
+ display: false
1763
+ }
1764
+ },
1765
+ scales: {
1766
+ y: {
1767
+ beginAtZero: true,
1768
+ ticks: {
1769
+ stepSize: 1
1770
+ }
1771
+ }
1772
+ }
1773
+ }
1774
+ });
1775
+ },
1776
+
1777
+ renderPriorityChart() {
1778
+ const ctx = document.getElementById('priority-chart');
1779
+ if (!ctx) return;
1780
+
1781
+ const tasks = TaskManager.tasks;
1782
+ const high = tasks.filter(t => t.priority === 'high').length;
1783
+ const medium = tasks.filter(t => t.priority === 'medium').length;
1784
+ const low = tasks.filter(t => t.priority === 'low').length;
1785
+
1786
+ if (this.charts.priority) {
1787
+ this.charts.priority.destroy();
1788
+ }
1789
+
1790
+ this.charts.priority = new Chart(ctx, {
1791
+ type: 'doughnut',
1792
+ data: {
1793
+ labels: ['عالية', 'متوسطة', 'منخفضة'],
1794
+ datasets: [{
1795
+ data: [high, medium, low],
1796
+ backgroundColor: ['#dc3545', '#ffc107', '#28a745'],
1797
+ borderWidth: 0
1798
+ }]
1799
+ },
1800
+ options: {
1801
+ responsive: true,
1802
+ maintainAspectRatio: false,
1803
+ plugins: {
1804
+ legend: {
1805
+ position: 'bottom'
1806
+ }
1807
+ }
1808
+ }
1809
+ });
1810
+
1811
+ // تحديث معدل الإنجاز
1812
+ const total = tasks.length || 1;
1813
+ const completed = tasks.filter(t => t.status === 'completed').length;
1814
+ const rate = Math.round((completed / total) * 100);
1815
+
1816
+ const completionCircle = document.getElementById('completion-circle');
1817
+ const completionValue = document.getElementById('completion-rate-value');
1818
+
1819
+ if (completionCircle) {
1820
+ const circumference = 283;
1821
+ const offset = circumference - (rate / 100) * circumference;
1822
+ completionCircle.style.strokeDashoffset = offset;
1823
+ }
1824
+
1825
+ if (completionValue) {
1826
+ completionValue.textContent = rate;
1827
+ }
1828
+ }
1829
+ };
1830
+
1831
+ // ============================================
1832
+ // التهيئة الرئيسية
1833
+ // ============================================
1834
+
1835
+ document.addEventListener('DOMContentLoaded', () => {
1836
+ // إظهار شاشة التحميل قليلاً ثم إخفاؤها
1837
+ setTimeout(() => {
1838
+ document.getElementById('loading-screen').classList.add('hidden');
1839
+ }, 1500);
1840
+
1841
+ // تهيئة جميع المديرين
1842
+ AuthManager.init();
1843
+ ProjectManager.init();
1844
+ TaskManager.init();
1845
+ TeamManager.init();
1846
+ NotificationManager.init();
1847
+ SettingsManager.init();
1848
+ ModalManager.init();
1849
+ NavigationManager.init();
1850
+ FormManager.init();
1851
+ ActionManager.init();
1852
+ ChartManager.init();
1853
+
1854
+ // تهيئة التقويم
1855
+ window.currentMonth = new Date().getMonth();
1856
+ window.currentYear = new Date().getFullYear();
1857
+
1858
+ console.log('✅ تم تهيئة TaskFlow Pro بنجاح');
1859
+ });
1860
+
1861
+ // تصدير الدوال العالمية للاستخدام في HTML
1862
+ window.ProjectManager = ProjectManager;
1863
+ window.TaskManager = TaskManager;
1864
+ window.ModalManager = ModalManager;
1865
+ window.ToastManager = ToastManager;
1866
+ window.AuthManager = AuthManager;
styles.css ADDED
@@ -0,0 +1,2778 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ TaskFlow Pro - Professional Task Management Application
3
+ ========================================================
4
+ Stylesheet - Professional Arabic Design (RTL)
5
+ Author: MiniMax Agent
6
+ Version: 2.0
7
+ */
8
+
9
+ /* ============================================
10
+ المتغيرات الأساسية والثيمات
11
+ ============================================ */
12
+
13
+ :root {
14
+ /* الألوان الرئيسية */
15
+ --primary-color: #4a90d9;
16
+ --primary-hover: #3a7bc8;
17
+ --primary-light: #e8f2fc;
18
+
19
+ /* ألوان الحالة */
20
+ --success-color: #28a745;
21
+ --success-light: #d4edda;
22
+ --warning-color: #ffc107;
23
+ --warning-light: #fff3cd;
24
+ --danger-color: #dc3545;
25
+ --danger-light: #f8d7da;
26
+ --info-color: #17a2b8;
27
+ --info-light: #d1ecf1;
28
+
29
+ /* ألوان الأولوية */
30
+ --high-priority: #dc3545;
31
+ --medium-priority: #ffc107;
32
+ --low-priority: #28a745;
33
+
34
+ /* ألوان الخلفية */
35
+ --bg-primary: #f8f9fa;
36
+ --bg-secondary: #ffffff;
37
+ --bg-tertiary: #e9ecef;
38
+ --bg-dark: #343a40;
39
+
40
+ /* ألوان النص */
41
+ --text-primary: #212529;
42
+ --text-secondary: #6c757d;
43
+ --text-muted: #adb5bd;
44
+ --text-light: #ffffff;
45
+
46
+ /* الحدود والظلال */
47
+ --border-color: #dee2e6;
48
+ --border-radius: 8px;
49
+ --border-radius-lg: 12px;
50
+ --border-radius-sm: 4px;
51
+ --box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
52
+ --box-shadow-lg: 0 4px 16px rgba(0, 0, 0, 0.12);
53
+
54
+ /* الانتقالات */
55
+ --transition-fast: 0.15s ease;
56
+ --transition-normal: 0.25s ease;
57
+ --transition-slow: 0.4s ease;
58
+
59
+ /* المسافات */
60
+ --spacing-xs: 4px;
61
+ --spacing-sm: 8px;
62
+ --spacing-md: 16px;
63
+ --spacing-lg: 24px;
64
+ --spacing-xl: 32px;
65
+
66
+ /* أحجام الخطوط */
67
+ --font-size-xs: 12px;
68
+ --font-size-sm: 14px;
69
+ --font-size-md: 16px;
70
+ --font-size-lg: 18px;
71
+ --font-size-xl: 24px;
72
+ --font-size-xxl: 32px;
73
+
74
+ /* عرض الشريط الجانبي */
75
+ --sidebar-width: 260px;
76
+ --sidebar-collapsed: 70px;
77
+
78
+ /* ارتفاع الرأس العلوي */
79
+ --header-height: 70px;
80
+ }
81
+
82
+ /* الوضع الداكن */
83
+ [data-theme="dark"] {
84
+ --bg-primary: #1a1d21;
85
+ --bg-secondary: #222629;
86
+ --bg-tertiary: #2d3238;
87
+ --bg-dark: #16191c;
88
+
89
+ --text-primary: #e9ecef;
90
+ --text-secondary: #adb5bd;
91
+ --text-muted: #6c757d;
92
+
93
+ --border-color: #3d4248;
94
+
95
+ --primary-light: #1e3a5f;
96
+ --success-light: #1e3d2f;
97
+ --warning-light: #3d3a1f;
98
+ --danger-light: #3d1e22;
99
+ --info-light: #1e3d3f;
100
+ }
101
+
102
+ /* ألوان مخصصة حسب اختيار المستخدم */
103
+ [data-color="green"] {
104
+ --primary-color: #28a745;
105
+ --primary-hover: #218838;
106
+ --primary-light: #d4edda;
107
+ }
108
+
109
+ [data-color="purple"] {
110
+ --primary-color: #6f42c1;
111
+ --primary-hover: #5a32a3;
112
+ --primary-light: #e2d9f3;
113
+ }
114
+
115
+ [data-color="orange"] {
116
+ --primary-color: #fd7e14;
117
+ --primary-hover: #e66a02;
118
+ --primary-light: #ffe5d0;
119
+ }
120
+
121
+ [data-color="pink"] {
122
+ --primary-color: #e83e8c;
123
+ --primary-hover: #d62c7a;
124
+ --primary-light: #f5d6e8;
125
+ }
126
+
127
+ /* ============================================
128
+ الإعدادات الأساسية
129
+ ============================================ */
130
+
131
+ * {
132
+ margin: 0;
133
+ padding: 0;
134
+ box-sizing: border-box;
135
+ }
136
+
137
+ html {
138
+ font-size: 16px;
139
+ scroll-behavior: smooth;
140
+ }
141
+
142
+ body {
143
+ font-family: 'Cairo', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
144
+ background-color: var(--bg-primary);
145
+ color: var(--text-primary);
146
+ line-height: 1.6;
147
+ overflow-x: hidden;
148
+ direction: rtl;
149
+ transition: background-color var(--transition-normal), color var(--transition-normal);
150
+ }
151
+
152
+ /* أحجام الخطوط */
153
+ body[data-font-size="small"] {
154
+ font-size: 14px;
155
+ }
156
+
157
+ body[data-font-size="large"] {
158
+ font-size: 18px;
159
+ }
160
+
161
+ a {
162
+ text-decoration: none;
163
+ color: inherit;
164
+ }
165
+
166
+ ul {
167
+ list-style: none;
168
+ }
169
+
170
+ button {
171
+ font-family: inherit;
172
+ cursor: pointer;
173
+ border: none;
174
+ outline: none;
175
+ background: none;
176
+ }
177
+
178
+ input, select, textarea {
179
+ font-family: inherit;
180
+ font-size: inherit;
181
+ outline: none;
182
+ border: none;
183
+ }
184
+
185
+ img {
186
+ max-width: 100%;
187
+ height: auto;
188
+ }
189
+
190
+ /* ============================================
191
+ شاشة التحميل
192
+ ============================================ */
193
+
194
+ .loading-screen {
195
+ position: fixed;
196
+ top: 0;
197
+ left: 0;
198
+ right: 0;
199
+ bottom: 0;
200
+ background: linear-gradient(135deg, var(--primary-color), #2d6cb5);
201
+ display: flex;
202
+ align-items: center;
203
+ justify-content: center;
204
+ z-index: 9999;
205
+ transition: opacity 0.5s ease, visibility 0.5s ease;
206
+ }
207
+
208
+ .loading-screen.hidden {
209
+ opacity: 0;
210
+ visibility: hidden;
211
+ }
212
+
213
+ .loading-content {
214
+ text-align: center;
215
+ color: white;
216
+ }
217
+
218
+ .loading-spinner {
219
+ width: 60px;
220
+ height: 60px;
221
+ border: 4px solid rgba(255, 255, 255, 0.3);
222
+ border-top-color: white;
223
+ border-radius: 50%;
224
+ margin: 0 auto 20px;
225
+ animation: spin 1s linear infinite;
226
+ }
227
+
228
+ @keyframes spin {
229
+ to {
230
+ transform: rotate(360deg);
231
+ }
232
+ }
233
+
234
+ .loading-content h2 {
235
+ font-size: var(--font-size-xl);
236
+ margin-bottom: 10px;
237
+ }
238
+
239
+ .loading-content p {
240
+ opacity: 0.9;
241
+ }
242
+
243
+ /* ============================================
244
+ صفحة تسجيل الدخول
245
+ ============================================ */
246
+
247
+ .login-page {
248
+ min-height: 100vh;
249
+ display: flex;
250
+ align-items: center;
251
+ justify-content: center;
252
+ background: linear-gradient(135deg, var(--primary-color) 0%, #2d6cb5 100%);
253
+ padding: 20px;
254
+ }
255
+
256
+ .login-page.hidden {
257
+ display: none;
258
+ }
259
+
260
+ .login-container {
261
+ background: var(--bg-secondary);
262
+ border-radius: var(--border-radius-lg);
263
+ box-shadow: var(--box-shadow-lg);
264
+ width: 100%;
265
+ max-width: 420px;
266
+ padding: 40px;
267
+ animation: slideUp 0.5s ease;
268
+ }
269
+
270
+ @keyframes slideUp {
271
+ from {
272
+ opacity: 0;
273
+ transform: translateY(30px);
274
+ }
275
+ to {
276
+ opacity: 1;
277
+ transform: translateY(0);
278
+ }
279
+ }
280
+
281
+ .login-header {
282
+ text-align: center;
283
+ margin-bottom: 30px;
284
+ }
285
+
286
+ .login-header .logo {
287
+ width: 80px;
288
+ height: 80px;
289
+ background: linear-gradient(135deg, var(--primary-color), var(--primary-hover));
290
+ border-radius: 20px;
291
+ display: flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ margin: 0 auto 15px;
295
+ font-size: 36px;
296
+ color: white;
297
+ box-shadow: 0 8px 20px rgba(74, 144, 217, 0.3);
298
+ }
299
+
300
+ .login-header h1 {
301
+ font-size: var(--font-size-xl);
302
+ color: var(--text-primary);
303
+ margin-bottom: 5px;
304
+ }
305
+
306
+ .login-header p {
307
+ color: var(--text-secondary);
308
+ font-size: var(--font-size-sm);
309
+ }
310
+
311
+ .login-form {
312
+ animation: fadeIn 0.3s ease;
313
+ }
314
+
315
+ .login-form.hidden {
316
+ display: none;
317
+ }
318
+
319
+ @keyframes fadeIn {
320
+ from {
321
+ opacity: 0;
322
+ }
323
+ to {
324
+ opacity: 1;
325
+ }
326
+ }
327
+
328
+ .form-group {
329
+ margin-bottom: 20px;
330
+ position: relative;
331
+ }
332
+
333
+ .form-group label {
334
+ display: block;
335
+ margin-bottom: 8px;
336
+ font-weight: 500;
337
+ color: var(--text-primary);
338
+ font-size: var(--font-size-sm);
339
+ }
340
+
341
+ .form-group input,
342
+ .form-group select,
343
+ .form-group textarea {
344
+ width: 100%;
345
+ padding: 14px 16px;
346
+ padding-left: 45px;
347
+ border: 2px solid var(--border-color);
348
+ border-radius: var(--border-radius);
349
+ background: var(--bg-primary);
350
+ color: var(--text-primary);
351
+ font-size: var(--font-size-md);
352
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
353
+ }
354
+
355
+ .form-group textarea {
356
+ min-height: 120px;
357
+ resize: vertical;
358
+ padding-left: 16px;
359
+ }
360
+
361
+ .form-group input:focus,
362
+ .form-group select:focus,
363
+ .form-group textarea:focus {
364
+ border-color: var(--primary-color);
365
+ box-shadow: 0 0 0 3px var(--primary-light);
366
+ }
367
+
368
+ .form-group input::placeholder {
369
+ color: var(--text-muted);
370
+ }
371
+
372
+ .form-group > i {
373
+ position: absolute;
374
+ right: 16px;
375
+ bottom: 14px;
376
+ color: var(--text-muted);
377
+ font-size: var(--font-size-md);
378
+ }
379
+
380
+ .form-group input:focus + i,
381
+ .form-group:has(input:focus) > i {
382
+ color: var(--primary-color);
383
+ }
384
+
385
+ .form-row {
386
+ display: grid;
387
+ grid-template-columns: 1fr 1fr;
388
+ gap: 16px;
389
+ }
390
+
391
+ /* الأزرار */
392
+ .btn {
393
+ display: inline-flex;
394
+ align-items: center;
395
+ justify-content: center;
396
+ gap: 8px;
397
+ padding: 12px 24px;
398
+ border-radius: var(--border-radius);
399
+ font-weight: 600;
400
+ font-size: var(--font-size-md);
401
+ transition: all var(--transition-fast);
402
+ cursor: pointer;
403
+ border: none;
404
+ }
405
+
406
+ .btn-primary {
407
+ background: linear-gradient(135deg, var(--primary-color), var(--primary-hover));
408
+ color: white;
409
+ box-shadow: 0 4px 12px rgba(74, 144, 217, 0.3);
410
+ }
411
+
412
+ .btn-primary:hover {
413
+ transform: translateY(-2px);
414
+ box-shadow: 0 6px 16px rgba(74, 144, 217, 0.4);
415
+ }
416
+
417
+ .btn-secondary {
418
+ background: var(--bg-tertiary);
419
+ color: var(--text-primary);
420
+ }
421
+
422
+ .btn-secondary:hover {
423
+ background: var(--border-color);
424
+ }
425
+
426
+ .btn-block {
427
+ width: 100%;
428
+ }
429
+
430
+ .btn-icon {
431
+ width: 40px;
432
+ height: 40px;
433
+ padding: 0;
434
+ border-radius: var(--border-radius);
435
+ background: var(--bg-tertiary);
436
+ color: var(--text-secondary);
437
+ }
438
+
439
+ .btn-icon:hover {
440
+ background: var(--border-color);
441
+ }
442
+
443
+ .btn-social {
444
+ width: 100%;
445
+ margin-bottom: 12px;
446
+ padding: 14px;
447
+ border-radius: var(--border-radius);
448
+ font-weight: 500;
449
+ }
450
+
451
+ .btn-google {
452
+ background: #db4437;
453
+ color: white;
454
+ }
455
+
456
+ .btn-github {
457
+ background: #24292e;
458
+ color: white;
459
+ }
460
+
461
+ .login-options {
462
+ display: flex;
463
+ justify-content: space-between;
464
+ align-items: center;
465
+ margin: 20px 0;
466
+ font-size: var(--font-size-sm);
467
+ }
468
+
469
+ .remember-me {
470
+ display: flex;
471
+ align-items: center;
472
+ gap: 8px;
473
+ cursor: pointer;
474
+ }
475
+
476
+ .remember-me input[type="checkbox"] {
477
+ width: 18px;
478
+ height: 18px;
479
+ cursor: pointer;
480
+ accent-color: var(--primary-color);
481
+ }
482
+
483
+ .forgot-password {
484
+ color: var(--primary-color);
485
+ transition: color var(--transition-fast);
486
+ }
487
+
488
+ .forgot-password:hover {
489
+ color: var(--primary-hover);
490
+ }
491
+
492
+ .divider {
493
+ display: flex;
494
+ align-items: center;
495
+ margin: 20px 0;
496
+ }
497
+
498
+ .divider::before,
499
+ .divider::after {
500
+ content: '';
501
+ flex: 1;
502
+ height: 1px;
503
+ background: var(--border-color);
504
+ }
505
+
506
+ .divider span {
507
+ padding: 0 15px;
508
+ color: var(--text-muted);
509
+ font-size: var(--font-size-sm);
510
+ }
511
+
512
+ .signup-link {
513
+ text-align: center;
514
+ margin-top: 20px;
515
+ color: var(--text-secondary);
516
+ }
517
+
518
+ .signup-link a {
519
+ color: var(--primary-color);
520
+ font-weight: 600;
521
+ }
522
+
523
+ /* ============================================
524
+ التطبيق الرئيسي
525
+ ============================================ */
526
+
527
+ .main-app {
528
+ display: flex;
529
+ min-height: 100vh;
530
+ }
531
+
532
+ .main-app.hidden {
533
+ display: none;
534
+ }
535
+
536
+ /* الشريط الجانبي */
537
+ .sidebar {
538
+ width: var(--sidebar-width);
539
+ background: var(--bg-secondary);
540
+ border-left: 1px solid var(--border-color);
541
+ display: flex;
542
+ flex-direction: column;
543
+ position: fixed;
544
+ top: 0;
545
+ right: 0;
546
+ bottom: 0;
547
+ z-index: 100;
548
+ transition: width var(--transition-normal);
549
+ box-shadow: var(--box-shadow);
550
+ }
551
+
552
+ .sidebar.collapsed {
553
+ width: var(--sidebar-collapsed);
554
+ }
555
+
556
+ .sidebar.collapsed .logo span,
557
+ .sidebar.collapsed nav span,
558
+ .sidebar.collapsed .sidebar-footer span {
559
+ display: none;
560
+ }
561
+
562
+ .sidebar-header {
563
+ padding: 20px;
564
+ display: flex;
565
+ align-items: center;
566
+ justify-content: space-between;
567
+ border-bottom: 1px solid var(--border-color);
568
+ }
569
+
570
+ .sidebar .logo {
571
+ display: flex;
572
+ align-items: center;
573
+ gap: 12px;
574
+ font-size: var(--font-size-lg);
575
+ font-weight: 700;
576
+ color: var(--primary-color);
577
+ }
578
+
579
+ .sidebar .logo i {
580
+ font-size: 28px;
581
+ }
582
+
583
+ .sidebar-toggle {
584
+ width: 32px;
585
+ height: 32px;
586
+ border-radius: 50%;
587
+ background: var(--bg-tertiary);
588
+ color: var(--text-secondary);
589
+ transition: all var(--transition-fast);
590
+ }
591
+
592
+ .sidebar-toggle:hover {
593
+ background: var(--primary-color);
594
+ color: white;
595
+ }
596
+
597
+ .sidebar-nav {
598
+ flex: 1;
599
+ padding: 20px 0;
600
+ overflow-y: auto;
601
+ }
602
+
603
+ .sidebar-nav ul {
604
+ padding: 0 12px;
605
+ }
606
+
607
+ .sidebar-nav li {
608
+ margin-bottom: 4px;
609
+ }
610
+
611
+ .sidebar-nav a {
612
+ display: flex;
613
+ align-items: center;
614
+ gap: 12px;
615
+ padding: 12px 16px;
616
+ border-radius: var(--border-radius);
617
+ color: var(--text-secondary);
618
+ font-weight: 500;
619
+ transition: all var(--transition-fast);
620
+ }
621
+
622
+ .sidebar-nav a i {
623
+ width: 24px;
624
+ text-align: center;
625
+ font-size: var(--font-size-md);
626
+ }
627
+
628
+ .sidebar-nav li.active a,
629
+ .sidebar-nav a:hover {
630
+ background: var(--primary-light);
631
+ color: var(--primary-color);
632
+ }
633
+
634
+ .sidebar-footer {
635
+ padding: 20px 0;
636
+ border-top: 1px solid var(--border-color);
637
+ }
638
+
639
+ .sidebar-footer ul {
640
+ padding: 0 12px;
641
+ }
642
+
643
+ .sidebar-footer li {
644
+ margin-bottom: 4px;
645
+ }
646
+
647
+ /* المحتوى الرئيسي */
648
+ .main-content {
649
+ flex: 1;
650
+ margin-right: var(--sidebar-width);
651
+ transition: margin-right var(--transition-normal);
652
+ min-height: 100vh;
653
+ display: flex;
654
+ flex-direction: column;
655
+ }
656
+
657
+ body.sidebar-collapsed .main-content {
658
+ margin-right: var(--sidebar-collapsed);
659
+ }
660
+
661
+ /* الرأس العلوي */
662
+ .main-header {
663
+ height: var(--header-height);
664
+ background: var(--bg-secondary);
665
+ border-bottom: 1px solid var(--border-color);
666
+ display: flex;
667
+ align-items: center;
668
+ justify-content: space-between;
669
+ padding: 0 24px;
670
+ position: sticky;
671
+ top: 0;
672
+ z-index: 50;
673
+ }
674
+
675
+ .header-right {
676
+ display: flex;
677
+ align-items: center;
678
+ gap: 16px;
679
+ }
680
+
681
+ .menu-toggle {
682
+ display: none;
683
+ width: 40px;
684
+ height: 40px;
685
+ border-radius: var(--border-radius);
686
+ background: var(--bg-tertiary);
687
+ color: var(--text-secondary);
688
+ font-size: var(--font-size-lg);
689
+ }
690
+
691
+ .search-box {
692
+ position: relative;
693
+ }
694
+
695
+ .search-box i {
696
+ position: absolute;
697
+ right: 14px;
698
+ top: 50%;
699
+ transform: translateY(-50%);
700
+ color: var(--text-muted);
701
+ }
702
+
703
+ .search-box input {
704
+ width: 300px;
705
+ padding: 10px 16px;
706
+ padding-right: 45px;
707
+ border: 1px solid var(--border-color);
708
+ border-radius: 25px;
709
+ background: var(--bg-tertiary);
710
+ color: var(--text-primary);
711
+ transition: all var(--transition-fast);
712
+ }
713
+
714
+ .search-box input:focus {
715
+ border-color: var(--primary-color);
716
+ box-shadow: 0 0 0 3px var(--primary-light);
717
+ width: 350px;
718
+ }
719
+
720
+ .header-left {
721
+ display: flex;
722
+ align-items: center;
723
+ }
724
+
725
+ .header-actions {
726
+ display: flex;
727
+ align-items: center;
728
+ gap: 12px;
729
+ }
730
+
731
+ .action-btn {
732
+ width: 42px;
733
+ height: 42px;
734
+ border-radius: 50%;
735
+ background: var(--bg-tertiary);
736
+ color: var(--text-secondary);
737
+ display: flex;
738
+ align-items: center;
739
+ justify-content: center;
740
+ position: relative;
741
+ transition: all var(--transition-fast);
742
+ }
743
+
744
+ .action-btn:hover {
745
+ background: var(--primary-light);
746
+ color: var(--primary-color);
747
+ }
748
+
749
+ .action-btn .badge {
750
+ position: absolute;
751
+ top: -2px;
752
+ left: -2px;
753
+ width: 20px;
754
+ height: 20px;
755
+ background: var(--danger-color);
756
+ color: white;
757
+ font-size: 11px;
758
+ font-weight: 600;
759
+ border-radius: 50%;
760
+ display: flex;
761
+ align-items: center;
762
+ justify-content: center;
763
+ }
764
+
765
+ .user-btn {
766
+ display: flex;
767
+ align-items: center;
768
+ gap: 10px;
769
+ padding: 6px 12px 6px 20px;
770
+ border-radius: 25px;
771
+ background: var(--bg-tertiary);
772
+ transition: all var(--transition-fast);
773
+ }
774
+
775
+ .user-btn:hover {
776
+ background: var(--border-color);
777
+ }
778
+
779
+ .user-avatar {
780
+ width: 36px;
781
+ height: 36px;
782
+ border-radius: 50%;
783
+ object-fit: cover;
784
+ }
785
+
786
+ .user-name {
787
+ font-weight: 500;
788
+ color: var(--text-primary);
789
+ }
790
+
791
+ .user-btn i {
792
+ font-size: 12px;
793
+ color: var(--text-muted);
794
+ }
795
+
796
+ /* القوائم المنسدلة */
797
+ .dropdown-menu {
798
+ position: absolute;
799
+ top: 100%;
800
+ left: 0;
801
+ background: var(--bg-secondary);
802
+ border: 1px solid var(--border-color);
803
+ border-radius: var(--border-radius);
804
+ box-shadow: var(--box-shadow-lg);
805
+ min-width: 200px;
806
+ opacity: 0;
807
+ visibility: hidden;
808
+ transform: translateY(10px);
809
+ transition: all var(--transition-fast);
810
+ z-index: 1000;
811
+ }
812
+
813
+ .dropdown-menu.active {
814
+ opacity: 1;
815
+ visibility: visible;
816
+ transform: translateY(5px);
817
+ }
818
+
819
+ .notifications-menu {
820
+ left: auto;
821
+ right: 0;
822
+ width: 350px;
823
+ max-height: 400px;
824
+ overflow: hidden;
825
+ }
826
+
827
+ .dropdown-header {
828
+ display: flex;
829
+ justify-content: space-between;
830
+ align-items: center;
831
+ padding: 15px;
832
+ border-bottom: 1px solid var(--border-color);
833
+ }
834
+
835
+ .dropdown-header h4 {
836
+ font-size: var(--font-size-md);
837
+ color: var(--text-primary);
838
+ }
839
+
840
+ .mark-all-read {
841
+ font-size: var(--font-size-sm);
842
+ color: var(--primary-color);
843
+ cursor: pointer;
844
+ }
845
+
846
+ .notifications-list {
847
+ max-height: 300px;
848
+ overflow-y: auto;
849
+ }
850
+
851
+ .notification-item {
852
+ padding: 12px 15px;
853
+ border-bottom: 1px solid var(--border-color);
854
+ display: flex;
855
+ gap: 12px;
856
+ cursor: pointer;
857
+ transition: background var(--transition-fast);
858
+ }
859
+
860
+ .notification-item:hover {
861
+ background: var(--bg-tertiary);
862
+ }
863
+
864
+ .notification-item.unread {
865
+ background: var(--primary-light);
866
+ }
867
+
868
+ .notification-icon {
869
+ width: 40px;
870
+ height: 40px;
871
+ border-radius: 50%;
872
+ display: flex;
873
+ align-items: center;
874
+ justify-content: center;
875
+ flex-shrink: 0;
876
+ }
877
+
878
+ .notification-icon.task {
879
+ background: var(--primary-light);
880
+ color: var(--primary-color);
881
+ }
882
+
883
+ .notification-icon.comment {
884
+ background: var(--info-light);
885
+ color: var(--info-color);
886
+ }
887
+
888
+ .notification-icon.project {
889
+ background: var(--success-light);
890
+ color: var(--success-color);
891
+ }
892
+
893
+ .notification-content h5 {
894
+ font-size: var(--font-size-sm);
895
+ color: var(--text-primary);
896
+ margin-bottom: 4px;
897
+ }
898
+
899
+ .notification-content p {
900
+ font-size: var(--font-size-xs);
901
+ color: var(--text-secondary);
902
+ margin-bottom: 4px;
903
+ }
904
+
905
+ .notification-time {
906
+ font-size: var(--font-size-xs);
907
+ color: var(--text-muted);
908
+ }
909
+
910
+ .user-menu {
911
+ left: auto;
912
+ right: 0;
913
+ min-width: 180px;
914
+ padding: 8px 0;
915
+ }
916
+
917
+ .user-menu a {
918
+ display: flex;
919
+ align-items: center;
920
+ gap: 10px;
921
+ padding: 10px 15px;
922
+ color: var(--text-secondary);
923
+ transition: all var(--transition-fast);
924
+ }
925
+
926
+ .user-menu a:hover {
927
+ background: var(--bg-tertiary);
928
+ color: var(--text-primary);
929
+ }
930
+
931
+ .user-menu a i {
932
+ width: 20px;
933
+ text-align: center;
934
+ }
935
+
936
+ .user-menu .divider {
937
+ margin: 8px 15px;
938
+ height: 1px;
939
+ background: var(--border-color);
940
+ }
941
+
942
+ /* منطقة المحتوى */
943
+ .content-area {
944
+ flex: 1;
945
+ padding: 24px;
946
+ overflow-y: auto;
947
+ }
948
+
949
+ /* العروض */
950
+ .view {
951
+ display: none;
952
+ animation: fadeIn 0.3s ease;
953
+ }
954
+
955
+ .view.active {
956
+ display: block;
957
+ }
958
+
959
+ .view-header {
960
+ display: flex;
961
+ justify-content: space-between;
962
+ align-items: center;
963
+ margin-bottom: 24px;
964
+ }
965
+
966
+ .view-header h1 {
967
+ font-size: var(--font-size-xxl);
968
+ color: var(--text-primary);
969
+ }
970
+
971
+ .view-actions {
972
+ display: flex;
973
+ align-items: center;
974
+ gap: 12px;
975
+ }
976
+
977
+ .filter-group {
978
+ display: flex;
979
+ gap: 10px;
980
+ }
981
+
982
+ .filter-group select {
983
+ padding: 10px 15px;
984
+ border: 1px solid var(--border-color);
985
+ border-radius: var(--border-radius);
986
+ background: var(--bg-secondary);
987
+ color: var(--text-primary);
988
+ cursor: pointer;
989
+ min-width: 150px;
990
+ }
991
+
992
+ /* ============================================
993
+ لوحة التحكم
994
+ ============================================ */
995
+
996
+ .dashboard-stats {
997
+ display: grid;
998
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
999
+ gap: 20px;
1000
+ margin-bottom: 24px;
1001
+ }
1002
+
1003
+ .stat-card {
1004
+ background: var(--bg-secondary);
1005
+ border-radius: var(--border-radius-lg);
1006
+ padding: 24px;
1007
+ display: flex;
1008
+ align-items: center;
1009
+ gap: 20px;
1010
+ box-shadow: var(--box-shadow);
1011
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
1012
+ }
1013
+
1014
+ .stat-card:hover {
1015
+ transform: translateY(-4px);
1016
+ box-shadow: var(--box-shadow-lg);
1017
+ }
1018
+
1019
+ .stat-icon {
1020
+ width: 60px;
1021
+ height: 60px;
1022
+ border-radius: 15px;
1023
+ display: flex;
1024
+ align-items: center;
1025
+ justify-content: center;
1026
+ font-size: 24px;
1027
+ }
1028
+
1029
+ .stat-icon.blue {
1030
+ background: var(--primary-light);
1031
+ color: var(--primary-color);
1032
+ }
1033
+
1034
+ .stat-icon.green {
1035
+ background: var(--success-light);
1036
+ color: var(--success-color);
1037
+ }
1038
+
1039
+ .stat-icon.orange {
1040
+ background: var(--warning-light);
1041
+ color: #d39e00;
1042
+ }
1043
+
1044
+ .stat-icon.purple {
1045
+ background: #f3e8ff;
1046
+ color: #9333ea;
1047
+ }
1048
+
1049
+ .stat-info h3 {
1050
+ font-size: var(--font-size-xxl);
1051
+ color: var(--text-primary);
1052
+ margin-bottom: 4px;
1053
+ }
1054
+
1055
+ .stat-info p {
1056
+ color: var(--text-secondary);
1057
+ font-size: var(--font-size-sm);
1058
+ }
1059
+
1060
+ .dashboard-content {
1061
+ display: grid;
1062
+ grid-template-columns: 2fr 1fr;
1063
+ gap: 24px;
1064
+ }
1065
+
1066
+ .dashboard-main {
1067
+ display: flex;
1068
+ flex-direction: column;
1069
+ gap: 24px;
1070
+ }
1071
+
1072
+ .dashboard-sidebar {
1073
+ display: flex;
1074
+ flex-direction: column;
1075
+ gap: 24px;
1076
+ }
1077
+
1078
+ /* البطاقات */
1079
+ .card {
1080
+ background: var(--bg-secondary);
1081
+ border-radius: var(--border-radius-lg);
1082
+ box-shadow: var(--box-shadow);
1083
+ overflow: hidden;
1084
+ }
1085
+
1086
+ .card-header {
1087
+ display: flex;
1088
+ justify-content: space-between;
1089
+ align-items: center;
1090
+ padding: 20px;
1091
+ border-bottom: 1px solid var(--border-color);
1092
+ }
1093
+
1094
+ .card-header h3 {
1095
+ font-size: var(--font-size-lg);
1096
+ color: var(--text-primary);
1097
+ display: flex;
1098
+ align-items: center;
1099
+ gap: 10px;
1100
+ }
1101
+
1102
+ .card-header h3 i {
1103
+ color: var(--primary-color);
1104
+ }
1105
+
1106
+ .view-all {
1107
+ color: var(--primary-color);
1108
+ font-size: var(--font-size-sm);
1109
+ font-weight: 500;
1110
+ transition: color var(--transition-fast);
1111
+ }
1112
+
1113
+ .view-all:hover {
1114
+ color: var(--primary-hover);
1115
+ }
1116
+
1117
+ .card-body {
1118
+ padding: 20px;
1119
+ }
1120
+
1121
+ /* شريط التقدم */
1122
+ .progress-chart {
1123
+ padding: 10px 0;
1124
+ }
1125
+
1126
+ .progress-bar-container {
1127
+ margin-bottom: 20px;
1128
+ }
1129
+
1130
+ .progress-label {
1131
+ display: flex;
1132
+ justify-content: space-between;
1133
+ margin-bottom: 10px;
1134
+ font-weight: 500;
1135
+ color: var(--text-primary);
1136
+ }
1137
+
1138
+ .progress-bar {
1139
+ height: 12px;
1140
+ background: var(--bg-tertiary);
1141
+ border-radius: 6px;
1142
+ overflow: hidden;
1143
+ }
1144
+
1145
+ .progress-fill {
1146
+ height: 100%;
1147
+ background: linear-gradient(90deg, var(--primary-color), var(--success-color));
1148
+ border-radius: 6px;
1149
+ width: 0%;
1150
+ transition: width 1s ease;
1151
+ }
1152
+
1153
+ .chart-legend {
1154
+ display: flex;
1155
+ gap: 20px;
1156
+ justify-content: center;
1157
+ }
1158
+
1159
+ .legend-item {
1160
+ display: flex;
1161
+ align-items: center;
1162
+ gap: 8px;
1163
+ font-size: var(--font-size-sm);
1164
+ color: var(--text-secondary);
1165
+ }
1166
+
1167
+ .legend-color {
1168
+ width: 12px;
1169
+ height: 12px;
1170
+ border-radius: 50%;
1171
+ }
1172
+
1173
+ .legend-color.completed {
1174
+ background: var(--success-color);
1175
+ }
1176
+
1177
+ .legend-color.in-progress {
1178
+ background: var(--primary-color);
1179
+ }
1180
+
1181
+ .legend-color.pending {
1182
+ background: var(--warning-color);
1183
+ }
1184
+
1185
+ /* قوائم المهام */
1186
+ .featured-tasks,
1187
+ .today-tasks {
1188
+ display: flex;
1189
+ flex-direction: column;
1190
+ gap: 12px;
1191
+ }
1192
+
1193
+ .task-item {
1194
+ display: flex;
1195
+ align-items: center;
1196
+ gap: 12px;
1197
+ padding: 12px;
1198
+ background: var(--bg-primary);
1199
+ border-radius: var(--border-radius);
1200
+ cursor: pointer;
1201
+ transition: all var(--transition-fast);
1202
+ }
1203
+
1204
+ .task-item:hover {
1205
+ background: var(--bg-tertiary);
1206
+ }
1207
+
1208
+ .task-item.completed .task-text {
1209
+ text-decoration: line-through;
1210
+ color: var(--text-muted);
1211
+ }
1212
+
1213
+ .task-checkbox {
1214
+ width: 22px;
1215
+ height: 22px;
1216
+ border: 2px solid var(--border-color);
1217
+ border-radius: 50%;
1218
+ display: flex;
1219
+ align-items: center;
1220
+ justify-content: center;
1221
+ cursor: pointer;
1222
+ transition: all var(--transition-fast);
1223
+ flex-shrink: 0;
1224
+ }
1225
+
1226
+ .task-checkbox:hover {
1227
+ border-color: var(--primary-color);
1228
+ }
1229
+
1230
+ .task-item.completed .task-checkbox {
1231
+ background: var(--success-color);
1232
+ border-color: var(--success-color);
1233
+ color: white;
1234
+ }
1235
+
1236
+ .task-text {
1237
+ flex: 1;
1238
+ font-weight: 500;
1239
+ color: var(--text-primary);
1240
+ white-space: nowrap;
1241
+ overflow: hidden;
1242
+ text-overflow: ellipsis;
1243
+ }
1244
+
1245
+ .task-priority-badge {
1246
+ padding: 4px 10px;
1247
+ border-radius: 12px;
1248
+ font-size: var(--font-size-xs);
1249
+ font-weight: 600;
1250
+ }
1251
+
1252
+ .task-priority-badge.high {
1253
+ background: var(--danger-light);
1254
+ color: var(--danger-color);
1255
+ }
1256
+
1257
+ .task-priority-badge.medium {
1258
+ background: var(--warning-light);
1259
+ color: #856404;
1260
+ }
1261
+
1262
+ .task-priority-badge.low {
1263
+ background: var(--success-light);
1264
+ color: var(--success-color);
1265
+ }
1266
+
1267
+ /* توزيع المهام */
1268
+ .tasks-distribution {
1269
+ display: flex;
1270
+ flex-direction: column;
1271
+ gap: 16px;
1272
+ }
1273
+
1274
+ .distribution-item {
1275
+ display: flex;
1276
+ flex-direction: column;
1277
+ gap: 8px;
1278
+ }
1279
+
1280
+ .distribution-info {
1281
+ display: flex;
1282
+ justify-content: space-between;
1283
+ font-size: var(--font-size-sm);
1284
+ color: var(--text-secondary);
1285
+ }
1286
+
1287
+ .distribution-bar {
1288
+ height: 8px;
1289
+ background: var(--bg-tertiary);
1290
+ border-radius: 4px;
1291
+ overflow: hidden;
1292
+ }
1293
+
1294
+ .distribution-fill {
1295
+ height: 100%;
1296
+ border-radius: 4px;
1297
+ transition: width 1s ease;
1298
+ }
1299
+
1300
+ .distribution-fill.high {
1301
+ background: var(--high-priority);
1302
+ }
1303
+
1304
+ .distribution-fill.medium {
1305
+ background: var(--medium-priority);
1306
+ }
1307
+
1308
+ .distribution-fill.low {
1309
+ background: var(--low-priority);
1310
+ }
1311
+
1312
+ /* ============================================
1313
+ عرض المهام
1314
+ ============================================ */
1315
+
1316
+ .tasks-container {
1317
+ background: var(--bg-secondary);
1318
+ border-radius: var(--border-radius-lg);
1319
+ box-shadow: var(--box-shadow);
1320
+ overflow: hidden;
1321
+ }
1322
+
1323
+ .tasks-header {
1324
+ display: grid;
1325
+ grid-template-columns: 40px 2fr 1fr 100px 120px 120px 100px;
1326
+ gap: 16px;
1327
+ padding: 16px 20px;
1328
+ background: var(--bg-tertiary);
1329
+ border-bottom: 1px solid var(--border-color);
1330
+ font-weight: 600;
1331
+ color: var(--text-secondary);
1332
+ font-size: var(--font-size-sm);
1333
+ }
1334
+
1335
+ .tasks-list {
1336
+ min-height: 400px;
1337
+ }
1338
+
1339
+ .task-row {
1340
+ display: grid;
1341
+ grid-template-columns: 40px 2fr 1fr 100px 120px 120px 100px;
1342
+ gap: 16px;
1343
+ padding: 16px 20px;
1344
+ align-items: center;
1345
+ border-bottom: 1px solid var(--border-color);
1346
+ transition: background var(--transition-fast);
1347
+ }
1348
+
1349
+ .task-row:hover {
1350
+ background: var(--bg-tertiary);
1351
+ }
1352
+
1353
+ .task-row.completed .task-row-title {
1354
+ text-decoration: line-through;
1355
+ color: var(--text-muted);
1356
+ }
1357
+
1358
+ .task-row-actions {
1359
+ display: flex;
1360
+ gap: 8px;
1361
+ }
1362
+
1363
+ .task-row-actions button {
1364
+ width: 32px;
1365
+ height: 32px;
1366
+ border-radius: var(--border-radius-sm);
1367
+ display: flex;
1368
+ align-items: center;
1369
+ justify-content: center;
1370
+ color: var(--text-secondary);
1371
+ transition: all var(--transition-fast);
1372
+ }
1373
+
1374
+ .task-row-actions button:hover {
1375
+ background: var(--primary-light);
1376
+ color: var(--primary-color);
1377
+ }
1378
+
1379
+ .task-row-actions button.delete:hover {
1380
+ background: var(--danger-light);
1381
+ color: var(--danger-color);
1382
+ }
1383
+
1384
+ /* حالة فارغة */
1385
+ .empty-state {
1386
+ display: none;
1387
+ flex-direction: column;
1388
+ align-items: center;
1389
+ justify-content: center;
1390
+ padding: 60px 20px;
1391
+ text-align: center;
1392
+ }
1393
+
1394
+ .empty-state.show {
1395
+ display: flex;
1396
+ }
1397
+
1398
+ .empty-state i {
1399
+ font-size: 64px;
1400
+ color: var(--text-muted);
1401
+ margin-bottom: 20px;
1402
+ }
1403
+
1404
+ .empty-state h3 {
1405
+ font-size: var(--font-size-xl);
1406
+ color: var(--text-primary);
1407
+ margin-bottom: 8px;
1408
+ }
1409
+
1410
+ .empty-state p {
1411
+ color: var(--text-secondary);
1412
+ margin-bottom: 24px;
1413
+ }
1414
+
1415
+ /* ============================================
1416
+ عرض المشاريع
1417
+ ============================================ */
1418
+
1419
+ .projects-grid {
1420
+ display: grid;
1421
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
1422
+ gap: 24px;
1423
+ }
1424
+
1425
+ .project-card {
1426
+ background: var(--bg-secondary);
1427
+ border-radius: var(--border-radius-lg);
1428
+ box-shadow: var(--box-shadow);
1429
+ overflow: hidden;
1430
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
1431
+ }
1432
+
1433
+ .project-card:hover {
1434
+ transform: translateY(-4px);
1435
+ box-shadow: var(--box-shadow-lg);
1436
+ }
1437
+
1438
+ .project-header {
1439
+ height: 120px;
1440
+ position: relative;
1441
+ }
1442
+
1443
+ .project-color-bar {
1444
+ height: 100%;
1445
+ width: 100%;
1446
+ }
1447
+
1448
+ .project-actions-overlay {
1449
+ position: absolute;
1450
+ top: 10px;
1451
+ left: 10px;
1452
+ display: flex;
1453
+ gap: 8px;
1454
+ opacity: 0;
1455
+ transition: opacity var(--transition-fast);
1456
+ }
1457
+
1458
+ .project-card:hover .project-actions-overlay {
1459
+ opacity: 1;
1460
+ }
1461
+
1462
+ .project-actions-overlay button {
1463
+ width: 32px;
1464
+ height: 32px;
1465
+ border-radius: 50%;
1466
+ background: white;
1467
+ color: var(--text-secondary);
1468
+ box-shadow: var(--box-shadow);
1469
+ display: flex;
1470
+ align-items: center;
1471
+ justify-content: center;
1472
+ transition: all var(--transition-fast);
1473
+ }
1474
+
1475
+ .project-actions-overlay button:hover {
1476
+ background: var(--primary-color);
1477
+ color: white;
1478
+ }
1479
+
1480
+ .project-body {
1481
+ padding: 20px;
1482
+ }
1483
+
1484
+ .project-title {
1485
+ font-size: var(--font-size-lg);
1486
+ font-weight: 600;
1487
+ color: var(--text-primary);
1488
+ margin-bottom: 8px;
1489
+ }
1490
+
1491
+ .project-description {
1492
+ color: var(--text-secondary);
1493
+ font-size: var(--font-size-sm);
1494
+ margin-bottom: 16px;
1495
+ display: -webkit-box;
1496
+ -webkit-line-clamp: 2;
1497
+ -webkit-box-orient: vertical;
1498
+ overflow: hidden;
1499
+ }
1500
+
1501
+ .project-meta {
1502
+ display: flex;
1503
+ justify-content: space-between;
1504
+ align-items: center;
1505
+ padding-top: 16px;
1506
+ border-top: 1px solid var(--border-color);
1507
+ }
1508
+
1509
+ .project-progress {
1510
+ display: flex;
1511
+ align-items: center;
1512
+ gap: 10px;
1513
+ }
1514
+
1515
+ .project-progress-bar {
1516
+ width: 100px;
1517
+ height: 6px;
1518
+ background: var(--bg-tertiary);
1519
+ border-radius: 3px;
1520
+ overflow: hidden;
1521
+ }
1522
+
1523
+ .project-progress-fill {
1524
+ height: 100%;
1525
+ background: var(--primary-color);
1526
+ border-radius: 3px;
1527
+ }
1528
+
1529
+ .project-progress-text {
1530
+ font-size: var(--font-size-xs);
1531
+ color: var(--text-muted);
1532
+ }
1533
+
1534
+ .project-tasks-count {
1535
+ font-size: var(--font-size-sm);
1536
+ color: var(--text-secondary);
1537
+ }
1538
+
1539
+ /* ============================================
1540
+ لوحة كانبان
1541
+ ============================================ */
1542
+
1543
+ .kanban-board {
1544
+ display: grid;
1545
+ grid-template-columns: repeat(3, 1fr);
1546
+ gap: 24px;
1547
+ min-height: 500px;
1548
+ }
1549
+
1550
+ .kanban-column {
1551
+ background: var(--bg-secondary);
1552
+ border-radius: var(--border-radius-lg);
1553
+ box-shadow: var(--box-shadow);
1554
+ display: flex;
1555
+ flex-direction: column;
1556
+ }
1557
+
1558
+ .column-header {
1559
+ display: flex;
1560
+ justify-content: space-between;
1561
+ align-items: center;
1562
+ padding: 16px 20px;
1563
+ border-bottom: 1px solid var(--border-color);
1564
+ }
1565
+
1566
+ .column-header h3 {
1567
+ display: flex;
1568
+ align-items: center;
1569
+ gap: 8px;
1570
+ font-size: var(--font-size-md);
1571
+ color: var(--text-primary);
1572
+ }
1573
+
1574
+ .column-header .task-count {
1575
+ background: var(--bg-tertiary);
1576
+ padding: 4px 10px;
1577
+ border-radius: 12px;
1578
+ font-size: var(--font-size-sm);
1579
+ color: var(--text-secondary);
1580
+ }
1581
+
1582
+ .column-content {
1583
+ flex: 1;
1584
+ padding: 16px;
1585
+ overflow-y: auto;
1586
+ min-height: 200px;
1587
+ }
1588
+
1589
+ .kanban-card {
1590
+ background: var(--bg-primary);
1591
+ border-radius: var(--border-radius);
1592
+ padding: 16px;
1593
+ margin-bottom: 12px;
1594
+ cursor: grab;
1595
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
1596
+ border: 1px solid transparent;
1597
+ }
1598
+
1599
+ .kanban-card:hover {
1600
+ transform: translateY(-2px);
1601
+ box-shadow: var(--box-shadow);
1602
+ border-color: var(--primary-color);
1603
+ }
1604
+
1605
+ .kanban-card.dragging {
1606
+ opacity: 0.5;
1607
+ cursor: grabbing;
1608
+ }
1609
+
1610
+ .kanban-card-title {
1611
+ font-weight: 600;
1612
+ color: var(--text-primary);
1613
+ margin-bottom: 8px;
1614
+ }
1615
+
1616
+ .kanban-card-meta {
1617
+ display: flex;
1618
+ justify-content: space-between;
1619
+ align-items: center;
1620
+ font-size: var(--font-size-xs);
1621
+ color: var(--text-muted);
1622
+ }
1623
+
1624
+ .kanban-card-project {
1625
+ padding: 2px 8px;
1626
+ border-radius: 4px;
1627
+ background: var(--primary-light);
1628
+ color: var(--primary-color);
1629
+ font-weight: 500;
1630
+ }
1631
+
1632
+ .add-task-to-column {
1633
+ display: flex;
1634
+ align-items: center;
1635
+ justify-content: center;
1636
+ gap: 8px;
1637
+ padding: 12px;
1638
+ margin: 12px;
1639
+ border: 2px dashed var(--border-color);
1640
+ border-radius: var(--border-radius);
1641
+ color: var(--text-muted);
1642
+ font-weight: 500;
1643
+ transition: all var(--transition-fast);
1644
+ }
1645
+
1646
+ .add-task-to-column:hover {
1647
+ border-color: var(--primary-color);
1648
+ color: var(--primary-color);
1649
+ background: var(--primary-light);
1650
+ }
1651
+
1652
+ /* ============================================
1653
+ التقويم
1654
+ ============================================ */
1655
+
1656
+ .calendar-nav {
1657
+ display: flex;
1658
+ align-items: center;
1659
+ gap: 16px;
1660
+ }
1661
+
1662
+ .calendar-nav h3 {
1663
+ min-width: 180px;
1664
+ text-align: center;
1665
+ }
1666
+
1667
+ .calendar-container {
1668
+ background: var(--bg-secondary);
1669
+ border-radius: var(--border-radius-lg);
1670
+ box-shadow: var(--box-shadow);
1671
+ padding: 20px;
1672
+ }
1673
+
1674
+ .calendar-header {
1675
+ display: grid;
1676
+ grid-template-columns: repeat(7, 1fr);
1677
+ gap: 8px;
1678
+ margin-bottom: 10px;
1679
+ }
1680
+
1681
+ .day-name {
1682
+ text-align: center;
1683
+ font-weight: 600;
1684
+ color: var(--text-secondary);
1685
+ padding: 10px;
1686
+ }
1687
+
1688
+ .calendar-grid {
1689
+ display: grid;
1690
+ grid-template-columns: repeat(7, 1fr);
1691
+ gap: 8px;
1692
+ }
1693
+
1694
+ .calendar-day {
1695
+ aspect-ratio: 1;
1696
+ min-height: 100px;
1697
+ border: 1px solid var(--border-color);
1698
+ border-radius: var(--border-radius);
1699
+ padding: 8px;
1700
+ background: var(--bg-primary);
1701
+ cursor: pointer;
1702
+ transition: all var(--transition-fast);
1703
+ }
1704
+
1705
+ .calendar-day:hover {
1706
+ border-color: var(--primary-color);
1707
+ }
1708
+
1709
+ .calendar-day.other-month {
1710
+ opacity: 0.4;
1711
+ }
1712
+
1713
+ .calendar-day.today {
1714
+ border-color: var(--primary-color);
1715
+ background: var(--primary-light);
1716
+ }
1717
+
1718
+ .calendar-day-number {
1719
+ font-weight: 600;
1720
+ margin-bottom: 8px;
1721
+ }
1722
+
1723
+ .calendar-tasks {
1724
+ display: flex;
1725
+ flex-direction: column;
1726
+ gap: 4px;
1727
+ }
1728
+
1729
+ .calendar-task {
1730
+ padding: 2px 6px;
1731
+ border-radius: 4px;
1732
+ font-size: var(--font-size-xs);
1733
+ white-space: nowrap;
1734
+ overflow: hidden;
1735
+ text-overflow: ellipsis;
1736
+ cursor: pointer;
1737
+ }
1738
+
1739
+ .calendar-task.high {
1740
+ background: var(--danger-light);
1741
+ color: var(--danger-color);
1742
+ }
1743
+
1744
+ .calendar-task.medium {
1745
+ background: var(--warning-light);
1746
+ color: #856404;
1747
+ }
1748
+
1749
+ .calendar-task.low {
1750
+ background: var(--success-light);
1751
+ color: var(--success-color);
1752
+ }
1753
+
1754
+ .calendar-task.completed {
1755
+ background: var(--bg-tertiary);
1756
+ color: var(--text-muted);
1757
+ text-decoration: line-through;
1758
+ }
1759
+
1760
+ .calendar-legend {
1761
+ display: flex;
1762
+ gap: 20px;
1763
+ justify-content: center;
1764
+ margin-top: 20px;
1765
+ }
1766
+
1767
+ .legend-dot {
1768
+ width: 10px;
1769
+ height: 10px;
1770
+ border-radius: 50%;
1771
+ display: inline-block;
1772
+ }
1773
+
1774
+ .legend-dot.high {
1775
+ background: var(--high-priority);
1776
+ }
1777
+
1778
+ .legend-dot.medium {
1779
+ background: var(--medium-priority);
1780
+ }
1781
+
1782
+ .legend-dot.low {
1783
+ background: var(--low-priority);
1784
+ }
1785
+
1786
+ .legend-dot.completed {
1787
+ background: var(--text-muted);
1788
+ }
1789
+
1790
+ /* ============================================
1791
+ عرض الفريق
1792
+ ============================================ */
1793
+
1794
+ .team-grid {
1795
+ display: grid;
1796
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
1797
+ gap: 24px;
1798
+ }
1799
+
1800
+ .team-member-card {
1801
+ background: var(--bg-secondary);
1802
+ border-radius: var(--border-radius-lg);
1803
+ box-shadow: var(--box-shadow);
1804
+ padding: 24px;
1805
+ text-align: center;
1806
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
1807
+ }
1808
+
1809
+ .team-member-card:hover {
1810
+ transform: translateY(-4px);
1811
+ box-shadow: var(--box-shadow-lg);
1812
+ }
1813
+
1814
+ .member-avatar {
1815
+ width: 80px;
1816
+ height: 80px;
1817
+ border-radius: 50%;
1818
+ object-fit: cover;
1819
+ margin-bottom: 16px;
1820
+ border: 4px solid var(--primary-light);
1821
+ }
1822
+
1823
+ .member-name {
1824
+ font-size: var(--font-size-lg);
1825
+ font-weight: 600;
1826
+ color: var(--text-primary);
1827
+ margin-bottom: 4px;
1828
+ }
1829
+
1830
+ .member-role {
1831
+ color: var(--primary-color);
1832
+ font-size: var(--font-size-sm);
1833
+ font-weight: 500;
1834
+ margin-bottom: 16px;
1835
+ }
1836
+
1837
+ .member-stats {
1838
+ display: flex;
1839
+ justify-content: center;
1840
+ gap: 24px;
1841
+ padding-top: 16px;
1842
+ border-top: 1px solid var(--border-color);
1843
+ }
1844
+
1845
+ .member-stat {
1846
+ text-align: center;
1847
+ }
1848
+
1849
+ .member-stat-value {
1850
+ font-size: var(--font-size-xl);
1851
+ font-weight: 700;
1852
+ color: var(--text-primary);
1853
+ }
1854
+
1855
+ .member-stat-label {
1856
+ font-size: var(--font-size-xs);
1857
+ color: var(--text-muted);
1858
+ }
1859
+
1860
+ /* ============================================
1861
+ التحليلات
1862
+ ============================================ */
1863
+
1864
+ .analytics-grid {
1865
+ display: grid;
1866
+ grid-template-columns: repeat(2, 1fr);
1867
+ gap: 24px;
1868
+ }
1869
+
1870
+ .analytics-card {
1871
+ background: var(--bg-secondary);
1872
+ border-radius: var(--border-radius-lg);
1873
+ box-shadow: var(--box-shadow);
1874
+ }
1875
+
1876
+ .analytics-card.large {
1877
+ grid-column: span 2;
1878
+ }
1879
+
1880
+ .card-header {
1881
+ display: flex;
1882
+ justify-content: space-between;
1883
+ align-items: center;
1884
+ padding: 20px;
1885
+ border-bottom: 1px solid var(--border-color);
1886
+ }
1887
+
1888
+ .card-header h3 {
1889
+ font-size: var(--font-size-lg);
1890
+ color: var(--text-primary);
1891
+ display: flex;
1892
+ align-items: center;
1893
+ gap: 10px;
1894
+ }
1895
+
1896
+ .card-header h3 i {
1897
+ color: var(--primary-color);
1898
+ }
1899
+
1900
+ .chart-container {
1901
+ padding: 20px;
1902
+ height: 300px;
1903
+ }
1904
+
1905
+ /* معدل الإنجاز */
1906
+ .completion-rate {
1907
+ display: flex;
1908
+ justify-content: center;
1909
+ padding: 20px;
1910
+ }
1911
+
1912
+ .rate-circle {
1913
+ position: relative;
1914
+ width: 180px;
1915
+ height: 180px;
1916
+ }
1917
+
1918
+ .rate-circle svg {
1919
+ transform: rotate(-90deg);
1920
+ width: 100%;
1921
+ height: 100%;
1922
+ }
1923
+
1924
+ .rate-circle circle {
1925
+ fill: none;
1926
+ stroke-width: 8;
1927
+ }
1928
+
1929
+ .rate-circle .bg {
1930
+ stroke: var(--bg-tertiary);
1931
+ }
1932
+
1933
+ .rate-circle .progress {
1934
+ stroke: var(--primary-color);
1935
+ stroke-linecap: round;
1936
+ stroke-dasharray: 283;
1937
+ stroke-dashoffset: 283;
1938
+ transition: stroke-dashoffset 1.5s ease;
1939
+ }
1940
+
1941
+ .rate-value {
1942
+ position: absolute;
1943
+ top: 50%;
1944
+ left: 50%;
1945
+ transform: translate(-50%, -50%);
1946
+ font-size: var(--font-size-xxl);
1947
+ font-weight: 700;
1948
+ color: var(--text-primary);
1949
+ }
1950
+
1951
+ /* أفضل الأعضاء */
1952
+ .top-performers {
1953
+ padding: 10px 0;
1954
+ }
1955
+
1956
+ .performer-item {
1957
+ display: flex;
1958
+ align-items: center;
1959
+ gap: 12px;
1960
+ padding: 12px 0;
1961
+ border-bottom: 1px solid var(--border-color);
1962
+ }
1963
+
1964
+ .performer-item:last-child {
1965
+ border-bottom: none;
1966
+ }
1967
+
1968
+ .performer-rank {
1969
+ width: 30px;
1970
+ height: 30px;
1971
+ border-radius: 50%;
1972
+ display: flex;
1973
+ align-items: center;
1974
+ justify-content: center;
1975
+ font-weight: 700;
1976
+ font-size: var(--font-size-sm);
1977
+ }
1978
+
1979
+ .performer-rank.gold {
1980
+ background: linear-gradient(135deg, #ffd700, #ffb700);
1981
+ color: #5c4100;
1982
+ }
1983
+
1984
+ .performer-rank.silver {
1985
+ background: linear-gradient(135deg, #c0c0c0, #a0a0a0);
1986
+ color: #333;
1987
+ }
1988
+
1989
+ .performer-rank.bronze {
1990
+ background: linear-gradient(135deg, #cd7f32, #a66928);
1991
+ color: white;
1992
+ }
1993
+
1994
+ .performer-info {
1995
+ flex: 1;
1996
+ }
1997
+
1998
+ .performer-name {
1999
+ font-weight: 600;
2000
+ color: var(--text-primary);
2001
+ }
2002
+
2003
+ .performer-tasks {
2004
+ font-size: var(--font-size-sm);
2005
+ color: var(--text-secondary);
2006
+ }
2007
+
2008
+ /* ============================================
2009
+ الإعدادات
2010
+ ============================================ */
2011
+
2012
+ .settings-container {
2013
+ display: grid;
2014
+ grid-template-columns: 240px 1fr;
2015
+ gap: 24px;
2016
+ background: var(--bg-secondary);
2017
+ border-radius: var(--border-radius-lg);
2018
+ box-shadow: var(--box-shadow);
2019
+ overflow: hidden;
2020
+ }
2021
+
2022
+ .settings-sidebar {
2023
+ background: var(--bg-tertiary);
2024
+ padding: 20px 0;
2025
+ }
2026
+
2027
+ .settings-sidebar ul li {
2028
+ margin-bottom: 4px;
2029
+ }
2030
+
2031
+ .settings-sidebar a {
2032
+ display: flex;
2033
+ align-items: center;
2034
+ gap: 12px;
2035
+ padding: 12px 20px;
2036
+ color: var(--text-secondary);
2037
+ font-weight: 500;
2038
+ transition: all var(--transition-fast);
2039
+ }
2040
+
2041
+ .settings-sidebar a i {
2042
+ width: 20px;
2043
+ text-align: center;
2044
+ }
2045
+
2046
+ .settings-sidebar li.active a,
2047
+ .settings-sidebar a:hover {
2048
+ background: var(--bg-secondary);
2049
+ color: var(--primary-color);
2050
+ }
2051
+
2052
+ .settings-content {
2053
+ padding: 30px;
2054
+ }
2055
+
2056
+ .settings-panel {
2057
+ display: none;
2058
+ animation: fadeIn 0.3s ease;
2059
+ }
2060
+
2061
+ .settings-panel.active {
2062
+ display: block;
2063
+ }
2064
+
2065
+ .settings-panel h2 {
2066
+ font-size: var(--font-size-xl);
2067
+ color: var(--text-primary);
2068
+ margin-bottom: 24px;
2069
+ padding-bottom: 16px;
2070
+ border-bottom: 1px solid var(--border-color);
2071
+ }
2072
+
2073
+ .settings-options {
2074
+ display: flex;
2075
+ flex-direction: column;
2076
+ gap: 20px;
2077
+ }
2078
+
2079
+ .setting-item {
2080
+ display: flex;
2081
+ justify-content: space-between;
2082
+ align-items: center;
2083
+ padding: 16px;
2084
+ background: var(--bg-primary);
2085
+ border-radius: var(--border-radius);
2086
+ }
2087
+
2088
+ .setting-info h4 {
2089
+ font-size: var(--font-size-md);
2090
+ color: var(--text-primary);
2091
+ margin-bottom: 4px;
2092
+ }
2093
+
2094
+ .setting-info p {
2095
+ font-size: var(--font-size-sm);
2096
+ color: var(--text-secondary);
2097
+ }
2098
+
2099
+ /* مفتاح التبديل */
2100
+ .toggle-switch {
2101
+ position: relative;
2102
+ width: 52px;
2103
+ height: 28px;
2104
+ }
2105
+
2106
+ .toggle-switch input {
2107
+ opacity: 0;
2108
+ width: 0;
2109
+ height: 0;
2110
+ }
2111
+
2112
+ .toggle-switch .slider {
2113
+ position: absolute;
2114
+ cursor: pointer;
2115
+ top: 0;
2116
+ left: 0;
2117
+ right: 0;
2118
+ bottom: 0;
2119
+ background-color: var(--bg-tertiary);
2120
+ border-radius: 28px;
2121
+ transition: var(--transition-fast);
2122
+ }
2123
+
2124
+ .toggle-switch .slider::before {
2125
+ position: absolute;
2126
+ content: "";
2127
+ height: 22px;
2128
+ width: 22px;
2129
+ right: 3px;
2130
+ bottom: 3px;
2131
+ background-color: white;
2132
+ border-radius: 50%;
2133
+ transition: var(--transition-fast);
2134
+ box-shadow: var(--box-shadow);
2135
+ }
2136
+
2137
+ .toggle-switch input:checked + .slider {
2138
+ background-color: var(--primary-color);
2139
+ }
2140
+
2141
+ .toggle-switch input:checked + .slider::before {
2142
+ transform: translateX(-24px);
2143
+ }
2144
+
2145
+ /* خيارات الألوان */
2146
+ .color-options {
2147
+ display: flex;
2148
+ gap: 10px;
2149
+ }
2150
+
2151
+ .color-option {
2152
+ width: 36px;
2153
+ height: 36px;
2154
+ border-radius: 50%;
2155
+ border: 3px solid transparent;
2156
+ cursor: pointer;
2157
+ transition: transform var(--transition-fast), border-color var(--transition-fast);
2158
+ }
2159
+
2160
+ .color-option:hover {
2161
+ transform: scale(1.1);
2162
+ }
2163
+
2164
+ .color-option.blue {
2165
+ background: #4a90d9;
2166
+ }
2167
+
2168
+ .color-option.green {
2169
+ background: #28a745;
2170
+ }
2171
+
2172
+ .color-option.purple {
2173
+ background: #6f42c1;
2174
+ }
2175
+
2176
+ .color-option.orange {
2177
+ background: #fd7e14;
2178
+ }
2179
+
2180
+ .color-option.pink {
2181
+ background: #e83e8c;
2182
+ }
2183
+
2184
+ .color-option.active {
2185
+ border-color: var(--text-primary);
2186
+ }
2187
+
2188
+ /* ============================================
2189
+ النوافذ المنبثقة (Modals)
2190
+ ============================================ */
2191
+
2192
+ .modal {
2193
+ position: fixed;
2194
+ top: 0;
2195
+ left: 0;
2196
+ right: 0;
2197
+ bottom: 0;
2198
+ z-index: 1000;
2199
+ display: none;
2200
+ align-items: center;
2201
+ justify-content: center;
2202
+ padding: 20px;
2203
+ }
2204
+
2205
+ .modal.active {
2206
+ display: flex;
2207
+ }
2208
+
2209
+ .modal-overlay {
2210
+ position: absolute;
2211
+ top: 0;
2212
+ left: 0;
2213
+ right: 0;
2214
+ bottom: 0;
2215
+ background: rgba(0, 0, 0, 0.5);
2216
+ backdrop-filter: blur(4px);
2217
+ }
2218
+
2219
+ .modal-content {
2220
+ position: relative;
2221
+ background: var(--bg-secondary);
2222
+ border-radius: var(--border-radius-lg);
2223
+ box-shadow: var(--box-shadow-lg);
2224
+ width: 100%;
2225
+ max-width: 500px;
2226
+ max-height: 90vh;
2227
+ overflow-y: auto;
2228
+ animation: modalSlideIn 0.3s ease;
2229
+ }
2230
+
2231
+ .modal-content.large {
2232
+ max-width: 700px;
2233
+ }
2234
+
2235
+ @keyframes modalSlideIn {
2236
+ from {
2237
+ opacity: 0;
2238
+ transform: translateY(-30px) scale(0.95);
2239
+ }
2240
+ to {
2241
+ opacity: 1;
2242
+ transform: translateY(0) scale(1);
2243
+ }
2244
+ }
2245
+
2246
+ .modal-header {
2247
+ display: flex;
2248
+ justify-content: space-between;
2249
+ align-items: center;
2250
+ padding: 20px;
2251
+ border-bottom: 1px solid var(--border-color);
2252
+ }
2253
+
2254
+ .modal-header h3 {
2255
+ font-size: var(--font-size-lg);
2256
+ color: var(--text-primary);
2257
+ }
2258
+
2259
+ .modal-close {
2260
+ width: 36px;
2261
+ height: 36px;
2262
+ border-radius: 50%;
2263
+ background: var(--bg-tertiary);
2264
+ color: var(--text-secondary);
2265
+ display: flex;
2266
+ align-items: center;
2267
+ justify-content: center;
2268
+ transition: all var(--transition-fast);
2269
+ }
2270
+
2271
+ .modal-close:hover {
2272
+ background: var(--danger-light);
2273
+ color: var(--danger-color);
2274
+ }
2275
+
2276
+ .modal form {
2277
+ padding: 20px;
2278
+ }
2279
+
2280
+ .modal-footer {
2281
+ display: flex;
2282
+ justify-content: flex-end;
2283
+ gap: 12px;
2284
+ padding-top: 20px;
2285
+ border-top: 1px solid var(--border-color);
2286
+ margin-top: 20px;
2287
+ }
2288
+
2289
+ /* مربع اختيار */
2290
+ .checkbox-label {
2291
+ display: flex;
2292
+ align-items: center;
2293
+ gap: 10px;
2294
+ cursor: pointer;
2295
+ font-weight: 500;
2296
+ color: var(--text-primary);
2297
+ }
2298
+
2299
+ .checkbox-label input[type="checkbox"] {
2300
+ width: 20px;
2301
+ height: 20px;
2302
+ accent-color: var(--primary-color);
2303
+ }
2304
+
2305
+ /* تفاصيل المهمة */
2306
+ .task-details-content {
2307
+ padding: 20px;
2308
+ }
2309
+
2310
+ .task-detail-header {
2311
+ display: flex;
2312
+ justify-content: space-between;
2313
+ align-items: flex-start;
2314
+ margin-bottom: 20px;
2315
+ }
2316
+
2317
+ .task-detail-title {
2318
+ font-size: var(--font-size-xl);
2319
+ color: var(--text-primary);
2320
+ }
2321
+
2322
+ .task-detail-meta {
2323
+ display: flex;
2324
+ gap: 16px;
2325
+ flex-wrap: wrap;
2326
+ margin-bottom: 20px;
2327
+ }
2328
+
2329
+ .task-detail-meta span {
2330
+ display: flex;
2331
+ align-items: center;
2332
+ gap: 6px;
2333
+ padding: 6px 12px;
2334
+ background: var(--bg-tertiary);
2335
+ border-radius: var(--border-radius);
2336
+ font-size: var(--font-size-sm);
2337
+ color: var(--text-secondary);
2338
+ }
2339
+
2340
+ .task-detail-meta span i {
2341
+ color: var(--primary-color);
2342
+ }
2343
+
2344
+ .task-detail-description {
2345
+ padding: 16px;
2346
+ background: var(--bg-primary);
2347
+ border-radius: var(--border-radius);
2348
+ margin-bottom: 20px;
2349
+ }
2350
+
2351
+ .task-detail-description h4 {
2352
+ font-size: var(--font-size-md);
2353
+ color: var(--text-primary);
2354
+ margin-bottom: 8px;
2355
+ }
2356
+
2357
+ .task-detail-description p {
2358
+ color: var(--text-secondary);
2359
+ line-height: 1.8;
2360
+ }
2361
+
2362
+ /* ============================================
2363
+ الإضافة السريعة
2364
+ ============================================ */
2365
+
2366
+ .quick-add-popup {
2367
+ position: fixed;
2368
+ bottom: 30px;
2369
+ left: 50%;
2370
+ transform: translateX(-50%);
2371
+ z-index: 500;
2372
+ background: var(--bg-secondary);
2373
+ border-radius: var(--border-radius-lg);
2374
+ box-shadow: var(--box-shadow-lg);
2375
+ padding: 12px 16px;
2376
+ animation: slideUp 0.3s ease;
2377
+ }
2378
+
2379
+ .quick-add-popup.hidden {
2380
+ display: none;
2381
+ }
2382
+
2383
+ .quick-add-content {
2384
+ display: flex;
2385
+ gap: 12px;
2386
+ align-items: center;
2387
+ }
2388
+
2389
+ .quick-add-content input {
2390
+ width: 300px;
2391
+ padding: 12px 16px;
2392
+ border: 2px solid var(--border-color);
2393
+ border-radius: var(--border-radius);
2394
+ background: var(--bg-primary);
2395
+ color: var(--text-primary);
2396
+ font-size: var(--font-size-md);
2397
+ }
2398
+
2399
+ .quick-add-content input:focus {
2400
+ border-color: var(--primary-color);
2401
+ }
2402
+
2403
+ /* ============================================
2404
+ رسائل التنبيه (Toasts)
2405
+ ============================================ */
2406
+
2407
+ .toast-container {
2408
+ position: fixed;
2409
+ top: 90px;
2410
+ left: 50%;
2411
+ transform: translateX(-50%);
2412
+ z-index: 2000;
2413
+ display: flex;
2414
+ flex-direction: column;
2415
+ gap: 10px;
2416
+ }
2417
+
2418
+ .toast {
2419
+ display: flex;
2420
+ align-items: center;
2421
+ gap: 12px;
2422
+ padding: 14px 20px;
2423
+ background: var(--bg-secondary);
2424
+ border-radius: var(--border-radius);
2425
+ box-shadow: var(--box-shadow-lg);
2426
+ animation: toastSlideIn 0.3s ease;
2427
+ min-width: 300px;
2428
+ }
2429
+
2430
+ @keyframes toastSlideIn {
2431
+ from {
2432
+ opacity: 0;
2433
+ transform: translateY(-20px);
2434
+ }
2435
+ to {
2436
+ opacity: 1;
2437
+ transform: translateY(0);
2438
+ }
2439
+ }
2440
+
2441
+ .toast.success {
2442
+ border-right: 4px solid var(--success-color);
2443
+ }
2444
+
2445
+ .toast.error {
2446
+ border-right: 4px solid var(--danger-color);
2447
+ }
2448
+
2449
+ .toast.warning {
2450
+ border-right: 4px solid var(--warning-color);
2451
+ }
2452
+
2453
+ .toast.info {
2454
+ border-right: 4px solid var(--info-color);
2455
+ }
2456
+
2457
+ .toast-icon {
2458
+ font-size: var(--font-size-lg);
2459
+ }
2460
+
2461
+ .toast.success .toast-icon {
2462
+ color: var(--success-color);
2463
+ }
2464
+
2465
+ .toast.error .toast-icon {
2466
+ color: var(--danger-color);
2467
+ }
2468
+
2469
+ .toast.warning .toast-icon {
2470
+ color: var(--warning-color);
2471
+ }
2472
+
2473
+ .toast.info .toast-icon {
2474
+ color: var(--info-color);
2475
+ }
2476
+
2477
+ .toast-message {
2478
+ flex: 1;
2479
+ color: var(--text-primary);
2480
+ font-weight: 500;
2481
+ }
2482
+
2483
+ /* ============================================
2484
+ استجابة الشاشات الصغيرة
2485
+ ============================================ */
2486
+
2487
+ @media (max-width: 1200px) {
2488
+ .dashboard-content {
2489
+ grid-template-columns: 1fr;
2490
+ }
2491
+
2492
+ .analytics-grid {
2493
+ grid-template-columns: 1fr;
2494
+ }
2495
+
2496
+ .analytics-card.large {
2497
+ grid-column: span 1;
2498
+ }
2499
+ }
2500
+
2501
+ @media (max-width: 992px) {
2502
+ .sidebar {
2503
+ transform: translateX(100%);
2504
+ }
2505
+
2506
+ .sidebar.active {
2507
+ transform: translateX(0);
2508
+ }
2509
+
2510
+ .main-content {
2511
+ margin-right: 0;
2512
+ }
2513
+
2514
+ .menu-toggle {
2515
+ display: flex;
2516
+ }
2517
+
2518
+ .search-box input {
2519
+ width: 200px;
2520
+ }
2521
+
2522
+ .search-box input:focus {
2523
+ width: 250px;
2524
+ }
2525
+
2526
+ .kanban-board {
2527
+ grid-template-columns: 1fr;
2528
+ overflow-x: auto;
2529
+ }
2530
+
2531
+ .tasks-header,
2532
+ .task-row {
2533
+ grid-template-columns: 40px 1fr 80px;
2534
+ }
2535
+
2536
+ .task-project,
2537
+ .task-due-date {
2538
+ display: none;
2539
+ }
2540
+
2541
+ .settings-container {
2542
+ grid-template-columns: 1fr;
2543
+ }
2544
+
2545
+ .settings-sidebar {
2546
+ display: flex;
2547
+ overflow-x: auto;
2548
+ padding: 10px;
2549
+ }
2550
+
2551
+ .settings-sidebar ul {
2552
+ display: flex;
2553
+ gap: 8px;
2554
+ }
2555
+
2556
+ .settings-sidebar li {
2557
+ flex-shrink: 0;
2558
+ }
2559
+ }
2560
+
2561
+ @media (max-width: 768px) {
2562
+ .header-right {
2563
+ flex: 1;
2564
+ }
2565
+
2566
+ .search-box {
2567
+ display: none;
2568
+ }
2569
+
2570
+ .user-name {
2571
+ display: none;
2572
+ }
2573
+
2574
+ .view-header {
2575
+ flex-direction: column;
2576
+ gap: 16px;
2577
+ align-items: flex-start;
2578
+ }
2579
+
2580
+ .view-actions {
2581
+ width: 100%;
2582
+ flex-wrap: wrap;
2583
+ }
2584
+
2585
+ .filter-group {
2586
+ width: 100%;
2587
+ flex-wrap: wrap;
2588
+ }
2589
+
2590
+ .filter-group select {
2591
+ flex: 1;
2592
+ min-width: 120px;
2593
+ }
2594
+
2595
+ .dashboard-stats {
2596
+ grid-template-columns: repeat(2, 1fr);
2597
+ }
2598
+
2599
+ .stat-card {
2600
+ flex-direction: column;
2601
+ text-align: center;
2602
+ }
2603
+
2604
+ .calendar-header {
2605
+ display: none;
2606
+ }
2607
+
2608
+ .calendar-grid {
2609
+ grid-template-columns: repeat(7, 1fr);
2610
+ }
2611
+
2612
+ .calendar-day {
2613
+ min-height: 60px;
2614
+ }
2615
+
2616
+ .calendar-tasks {
2617
+ display: none;
2618
+ }
2619
+
2620
+ .modal-content {
2621
+ margin: 10px;
2622
+ max-height: calc(100vh - 20px);
2623
+ }
2624
+
2625
+ .form-row {
2626
+ grid-template-columns: 1fr;
2627
+ }
2628
+ }
2629
+
2630
+ @media (max-width: 480px) {
2631
+ .content-area {
2632
+ padding: 16px;
2633
+ }
2634
+
2635
+ .dashboard-stats {
2636
+ grid-template-columns: 1fr;
2637
+ }
2638
+
2639
+ .stat-card {
2640
+ flex-direction: row;
2641
+ text-align: right;
2642
+ }
2643
+
2644
+ .projects-grid {
2645
+ grid-template-columns: 1fr;
2646
+ }
2647
+
2648
+ .team-grid {
2649
+ grid-template-columns: 1fr;
2650
+ }
2651
+
2652
+ .tasks-header {
2653
+ display: none;
2654
+ }
2655
+
2656
+ .task-row {
2657
+ grid-template-columns: 1fr;
2658
+ gap: 8px;
2659
+ }
2660
+
2661
+ .task-checkbox {
2662
+ position: absolute;
2663
+ top: 16px;
2664
+ left: 16px;
2665
+ }
2666
+
2667
+ .task-row {
2668
+ position: relative;
2669
+ padding-left: 50px;
2670
+ }
2671
+
2672
+ .user-btn {
2673
+ padding: 6px;
2674
+ }
2675
+
2676
+ .user-btn img {
2677
+ width: 32px;
2678
+ height: 32px;
2679
+ }
2680
+
2681
+ .quick-add-content input {
2682
+ width: 200px;
2683
+ }
2684
+ }
2685
+
2686
+ /* ============================================
2687
+ تحسينات إضافية
2688
+ ============================================ */
2689
+
2690
+ /* شريط التمرير المخصص */
2691
+ ::-webkit-scrollbar {
2692
+ width: 8px;
2693
+ height: 8px;
2694
+ }
2695
+
2696
+ ::-webkit-scrollbar-track {
2697
+ background: var(--bg-tertiary);
2698
+ }
2699
+
2700
+ ::-webkit-scrollbar-thumb {
2701
+ background: var(--text-muted);
2702
+ border-radius: 4px;
2703
+ }
2704
+
2705
+ ::-webkit-scrollbar-thumb:hover {
2706
+ background: var(--text-secondary);
2707
+ }
2708
+
2709
+ /* تحديد النص */
2710
+ ::selection {
2711
+ background: var(--primary-color);
2712
+ color: white;
2713
+ }
2714
+
2715
+ /* التركيز */
2716
+ :focus-visible {
2717
+ outline: 2px solid var(--primary-color);
2718
+ outline-offset: 2px;
2719
+ }
2720
+
2721
+ /* تلميحات الأدوات */
2722
+ [data-tooltip] {
2723
+ position: relative;
2724
+ }
2725
+
2726
+ [data-tooltip]::after {
2727
+ content: attr(data-tooltip);
2728
+ position: absolute;
2729
+ bottom: 100%;
2730
+ left: 50%;
2731
+ transform: translateX(-50%);
2732
+ padding: 6px 12px;
2733
+ background: var(--bg-dark);
2734
+ color: white;
2735
+ font-size: var(--font-size-xs);
2736
+ border-radius: var(--border-radius-sm);
2737
+ white-space: nowrap;
2738
+ opacity: 0;
2739
+ visibility: hidden;
2740
+ transition: all var(--transition-fast);
2741
+ pointer-events: none;
2742
+ z-index: 100;
2743
+ }
2744
+
2745
+ [data-tooltip]:hover::after {
2746
+ opacity: 1;
2747
+ visibility: visible;
2748
+ bottom: calc(100% + 8px);
2749
+ }
2750
+
2751
+ /* تأثيرات إضافية */
2752
+ .pulse {
2753
+ animation: pulse 2s infinite;
2754
+ }
2755
+
2756
+ @keyframes pulse {
2757
+ 0% {
2758
+ box-shadow: 0 0 0 0 rgba(74, 144, 217, 0.4);
2759
+ }
2760
+ 70% {
2761
+ box-shadow: 0 0 0 10px rgba(74, 144, 217, 0);
2762
+ }
2763
+ 100% {
2764
+ box-shadow: 0 0 0 0 rgba(74, 144, 217, 0);
2765
+ }
2766
+ }
2767
+
2768
+ .shake {
2769
+ animation: shake 0.5s ease;
2770
+ }
2771
+
2772
+ @keyframes shake {
2773
+ 0%, 100% { transform: translateX(0); }
2774
+ 10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
2775
+ 20%, 40%, 60%, 80% { transform: translateX(5px); }
2776
+ }
2777
+
2778
+ /* نهاية ملف التنسيقات */