{ "$schema": "../../schemas/code-crispies-module-schema.json", "id": "html-progress-meter", "title": "HTML Progress & Meter", "description": "اعرض حالة الإكمال والقياسات بشكل أصلي", "mode": "html", "difficulty": "beginner", "lessons": [ { "id": "progress-basic", "title": "أشرطة التقدم", "description": "عنصر <progress> يُظهر إكمال المهمة. استخدم value للتقدم الحالي و max للإجمالي.

ملاحظة: هذا ليس وسماً ذاتي الإغلاق! اكتب <progress>...</progress> مع نص بديل بالداخل للمتصفحات القديمة.", "task": "أنشئ شريط تقدم يُظهر 70% إكمال:
1. أضف <label> يقول Download:
2. أضف <progress> مع value=\"70\" و max=\"100\"", "previewHTML": "", "previewBaseCSS": "body { font-family: system-ui; padding: 20px; } label { display: block; margin-bottom: 8px; font-weight: 500; } progress { width: 100%; height: 20px; border-radius: 10px; } progress::-webkit-progress-bar { background: #e0e0e0; border-radius: 10px; } progress::-webkit-progress-value { background: linear-gradient(90deg, #4caf50, #8bc34a); border-radius: 10px; } progress::-moz-progress-bar { background: linear-gradient(90deg, #4caf50, #8bc34a); border-radius: 10px; }", "sandboxCSS": "", "initialCode": "", "solution": "\n70%", "previewContainer": "preview-area", "validations": [ { "type": "element_exists", "value": "progress", "message": "أضف عنصر <progress>" }, { "type": "attribute_value", "value": { "selector": "progress", "attr": "value", "value": "70" }, "message": "عيّن value=\"70\" في عنصر progress" }, { "type": "attribute_value", "value": { "selector": "progress", "attr": "max", "value": "100" }, "message": "عيّن max=\"100\" في عنصر progress" }, { "type": "element_exists", "value": "label", "message": "أضف <label> لشريط التقدم" } ] }, { "id": "progress-indeterminate", "title": "تقدم غير محدد", "description": "عندما يكون التقدم غير معروف (مثل التحميل)، احذف سمة value. هذا ينشئ حالة متحركة غير محددة.

مفيد لطلبات الشبكة أو العمليات ذات المدة غير المعروفة.", "task": "أنشئ مؤشر تحميل:
1. أضف <p> يقول Loading...
2. أضف <progress> بدون سمة value", "previewHTML": "", "previewBaseCSS": "body { font-family: system-ui; padding: 20px; } p { margin-bottom: 10px; color: #666; } progress { width: 100%; height: 8px; border-radius: 4px; } progress::-webkit-progress-bar { background: #e0e0e0; border-radius: 4px; }", "sandboxCSS": "", "initialCode": "", "solution": "

Loading...

\n", "previewContainer": "preview-area", "validations": [ { "type": "element_exists", "value": "progress", "message": "أضف عنصر <progress>" }, { "type": "element_exists", "value": "p", "message": "أضف <p> مع نص التحميل" } ] }, { "id": "meter-gauge", "title": "مقاييس meter", "description": "عنصر <meter> يعرض قيمة قياسية ضمن نطاق. استخدمه للقياسات مثل مساحة القرص، البطارية، أو التقييمات.

عيّن low و high و optimum لتحديد النطاقات الجيدة/السيئة - المتصفح يلونها وفقاً لذلك!", "task": "أنشئ مقياس مستوى البطارية:
1. أضف <label> يقول Battery:
2. أضف <meter> مع:
- value=\"0.8\"
- min=\"0\" و max=\"1\"
- low=\"0.2\" و high=\"0.8\"
- optimum=\"1\"", "previewHTML": "", "previewBaseCSS": "body { font-family: system-ui; padding: 20px; } label { display: block; margin-bottom: 8px; font-weight: 500; } meter { width: 100%; height: 25px; }", "sandboxCSS": "", "initialCode": "", "solution": "\n80%", "previewContainer": "preview-area", "validations": [ { "type": "element_exists", "value": "meter", "message": "أضف عنصر <meter>" }, { "type": "attribute_value", "value": { "selector": "meter", "attr": "value", "value": "0.8" }, "message": "عيّن value=\"0.8\" في meter" }, { "type": "attribute_value", "value": { "selector": "meter", "attr": "min", "value": "0" }, "message": "عيّن min=\"0\" في meter" }, { "type": "attribute_value", "value": { "selector": "meter", "attr": "max", "value": "1" }, "message": "عيّن max=\"1\" في meter" }, { "type": "attribute_value", "value": { "selector": "meter", "attr": "low", "value": "0.2" }, "message": "عيّن low=\"0.2\" لتحديد العتبة المنخفضة" }, { "type": "attribute_value", "value": { "selector": "meter", "attr": "high", "value": "0.8" }, "message": "عيّن high=\"0.8\" لتحديد العتبة العالية" }, { "type": "attribute_value", "value": { "selector": "meter", "attr": "optimum", "value": "1" }, "message": "عيّن optimum=\"1\" للإشارة إلى القيمة المثلى" }, { "type": "element_exists", "value": "label", "message": "أضف <label> للـ meter" } ] } ] }