/* ============================================================
   platform.css — ما يضيفه التطبيق فوق نظام التصميم
   ============================================================
   الملفات الأربعة قبله (tailwind · fonts · design-system · lms · app)
   تُتبنّى من نموذج lms-platform **كما هي** ولا تُعدَّل، لتبقى قابلة
   للتحديث بنسخ مباشر حين يصدر النموذج نسخة جديدة (القرار 6).

   فكل ما يحتاجه التطبيق ولا يوفّره النموذج يُكتب هنا وحده، بلغته
   البصرية نفسها ومتغيّراته نفسها — لا بألوان أو مقاسات جديدة.

   يُحمَّل **أخيراً** في layouts/app.blade.php.
   ============================================================ */

/* -------------------------------------------------------------
   1) رابط تخطّي المحتوى — معيار قبول «تنقّل بلوحة المفاتيح» (§35)
   -------------------------------------------------------------
   ⚠️ `.skip-link` مستعملة في القالب الجذر منذ م0 ولا تعريف لها في أي
   ملف من ملفات النموذج (فُحصت الخمسة). أثرُ ذلك أن الرابط كان يُعرض
   نصاً ظاهراً فوق كل شاشة بدل أن يكون مخفياً حتى يصله التركيز.

   الإخفاء هنا بالإزاحة لا بـ`display:none`: العنصر المخفي بـnone لا
   يستقبل التركيز أصلاً، فيضيع الغرض كله.
   ------------------------------------------------------------- */
.skip-link {
  position: absolute;
  inset-inline-start: 12px;
  top: -60px;
  z-index: 100;
  padding: 10px 18px;
  border-radius: var(--r-lg, 12px);
  background: var(--grad-brand, linear-gradient(135deg, #0EA5E9, #0284C7));
  color: #fff;
  font-size: 13.5px;
  font-weight: 800;
  box-shadow: 0 8px 24px rgba(2, 132, 199, .35);
  transition: top .18s var(--ease-out, cubic-bezier(.22, 1, .36, 1));
}

.skip-link:focus,
.skip-link:focus-visible {
  top: 12px;
  outline: 3px solid #fff;
  outline-offset: 2px;
}

/* -------------------------------------------------------------
   2) العنصر غير المنفَّذ — النمط الإلزامي الأول (CLAUDE.md)
   -------------------------------------------------------------
   `.nav-leaf.is-soon` معرَّفة في النموذج لعناصر القائمة الجانبية وحدها.
   أما الأزرار والروابط داخل الشاشات — «نسيت كلمة المرور» في AUTH-01
   مثلاً — فتحتاج التعميم نفسه: شفافية 62% ومؤشّر يقول إن هذا ليس
   إجراءً متاحاً، لا رابطاً يبدو عاملاً ثم يعتذر بعد الضغط.
   ------------------------------------------------------------- */
button.is-soon,
span.is-soon:not(.nav-leaf),
a.is-soon:not(.nav-leaf) {
  opacity: .62;
  cursor: help;
}

button.is-soon:hover,
span.is-soon:not(.nav-leaf):hover,
a.is-soon:not(.nav-leaf):hover {
  opacity: .82;
}

/* -------------------------------------------------------------
   3) حقل `.fld` معطَّل
   -------------------------------------------------------------
   تبويب «رمز لمرة واحدة» يعرض حقله معطَّلاً لأن إرساله يحتاج مزوّد
   رسائل متعاقَداً عليه (§36). بلا هذا التمييز يبدو الحقل صالحاً
   للكتابة فيه، فيحاول المستخدم ثم لا يحدث شيء.
   ------------------------------------------------------------- */
.fld > input:disabled,
.fld > select:disabled,
.fld > textarea:disabled {
  background: var(--slate-50, #F8FAFC);
  color: var(--slate-400, #94A3B8);
  cursor: not-allowed;
}

.fld > input:disabled + label {
  color: var(--slate-300, #CBD5E1);
}

/* -------------------------------------------------------------
   4) الإدخال الأصلي المخفي — `.field-hidden`
   -------------------------------------------------------------
   ⚠️ مستعملة في `<x-form.checkbox>` و`<x-form.radio-card>`
   و`<x-form.file>` منذ م0 **ولا تعريف لها في أي ملف من ملفات النموذج
   الخمسة** — فُحصت جميعاً. أثرُ ذلك أن المربّع الأصلي كان يظهر بجوار
   المربّع المصمَّم، فيرى المستخدم مربّعين لخيار واحد.

   الإخفاء بالاقتصاص لا بـ`display:none` ولا `visibility:hidden`:
   العنصر المخفي بأيٍّ منهما يخرج من ترتيب التركيز فلا يصله السهم ولا
   المسافة، ويسقط معه معيار «تنقّل بلوحة المفاتيح» (§35) — والحقل
   المطلوب المخفي بذلك لا يُبلّغ المتصفحُ عن سبب رفضه أصلاً.
   ------------------------------------------------------------- */
.field-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* -------------------------------------------------------------
   5) حالة الاختيار من الإدخال الأصلي لا من صنف يضيفه JS
   -------------------------------------------------------------
   النموذج التصميمي يلوّن الاختيار بصنف يضيفه JS: `.radio-card.on`
   و`.sup-check.checked` (lms.css:116 · design-system.css:562). أما
   مكوّنات هذا المشروع فتقود الشكل بـ`:checked` من الإدخال الأصلي
   عمداً (خطة-البناء.md، مكوّن النموذج) — فتعمل بلا JavaScript.

   لكن قواعد `:checked` المقابلة **لم تُكتب قط**، فكان المكوّنان
   يُعرضان بلا أثر للاختيار إطلاقاً: يضغط المستخدم فلا يتغيّر شيء.
   هذه هي القواعد المقابلة، بقيم النموذج نفسها لا بقيم جديدة.

   `:has()` للحاوية لأن الإدخال ابنٌ لها لا شقيق؛ والعلامة الداخلية
   بالشقيق المباشر فتعمل حتى بلا دعم `:has()`.
   ------------------------------------------------------------- */
.radio-card:has(input:checked) {
  border-color: var(--sky-500, #0EA5E9);
  background: var(--sky-50, #F0F9FF);
  box-shadow: 0 0 0 3px rgba(14, 165, 233, .1);
}

.radio-card input:checked ~ .dot {
  border-color: var(--sky-500, #0EA5E9);
}

.radio-card input:checked ~ .dot::after {
  content: '';
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: var(--sky-500, #0EA5E9);
}

.sup-check:has(input:checked) {
  border-color: var(--sky-500, #0EA5E9);
  background: var(--sky-50, #F0F9FF);
  box-shadow: 0 0 0 3px rgba(14, 165, 233, .1);
}

.sup-check input:checked ~ .cbx {
  background: var(--sky-500, #0EA5E9);
  border-color: var(--sky-500, #0EA5E9);
}

.sup-check input:checked ~ .cbx::after {
  content: '';
  width: 9px;
  height: 5px;
  border: 2px solid #fff;
  border-top: 0;
  border-right: 0;
  transform: rotate(-45deg) translateY(-1px);
}

/*
 * حلقة التركيز: الإدخال مقتصَص فلا تُرى حلقته، فتُنقل إلى الحاوية.
 * بدونها لا يعرف المتنقّل بلوحة المفاتيح أين هو (§35 «تنقّل بلوحة
 * المفاتيح + تباين مناسب»).
 */
.radio-card:has(input:focus-visible),
.sup-check:has(input:focus-visible) {
  outline: 3px solid var(--sky-400, #38BDF8);
  outline-offset: 2px;
}

/* -------------------------------------------------------------
   6) خطّ الهوية ومقاسه — طلب العروض §6 البند 1 (الفجوة RFP-6-03)
   -------------------------------------------------------------
   ألوان الهوية تسري وحدها: النموذج يقرأ لون العلامة من `var()` في 83
   موضعاً، فيكفي إعادة تعريف المتغيّرات (يفعله ThemeService في القالب
   الجذر). أما الخطّ فمكتوب في `fonts.css` عائلةً ثابتة لا متغيّراً،
   فيحتاج هاتين القاعدتين لتصله قيمة `--brand-font`.

   القاعدتان بلا أثر حين لا تخصيص: `var(--brand-font, inherit)` تسقط
   إلى الموروث، و`--brand-font-scale` إلى 1 — فتبقى الشاشة على Tajawal
   بمقاسه كما بناها النموذج، ولا يُبَثّ المتغيّران أصلاً.
   ------------------------------------------------------------- */
:root {
  --brand-font-scale: 1;
}

body {
  font-family: var(--brand-font, inherit);
}

/*
 * المقاس على `html` لا على `body`: مقاسات النموذج بوحدة `rem` تُقاس من
 * جذر المستند، فضربُها كلها معاً يحفظ تناسبها. تغييرُ `body` وحده يحرّك
 * ما بُني بـ`em` ويترك ما بُني بـ`rem` — فينكسر التناسب بدل أن يتغيّر.
 */
html {
  font-size: calc(16px * var(--brand-font-scale, 1));
}

/* -------------------------------------------------------------
   7) شريط البيئة — طلب العروض §7 محور «الاستضافة» (الفجوة RFP-7-03)
   -------------------------------------------------------------
   البند يطلب «بيان البيئات المتاحة». والبيان مكانه الشاشة نفسها لا
   ملف عرض: الخلط الذي وُضع البند لمنعه يقع أثناء الاستعمال — أحدهم
   يفتح بيئة الاعتماد فيرى أرقاماً معقولة فيبني عليها قراراً.

   لماذا تعريفان لموضع واحد؟ لأن للمنصة إطارَي تخطيط مختلفَين:

     body.app-shell   البوابات الداخلية — الصفحة نفسها لا تتمرّر
                      (height:100vh; overflow:hidden)، والسايدبار
                      والهيدر مثبَّتان بإزاحات مطلقة. فالشريط مثبَّت
                      مثلها، وما تحته يُزاح بارتفاعه. و`position:sticky`
                      لا تعمل هنا أصلاً: لا حاوٍ متمرّر تحت الجسم.

     غيرها            البوابة العامة والشاشات المجرّدة — الصفحة تتمرّر
                      طبيعياً، فالشريط لاصق يبقى في الأعلى. وهيدر
                      البوابة العامة `.portal-header` لاصقٌ عند 0 كذلك،
                      فيُزاح إلى ما تحت الشريط وإلا تراكبا.

   الارتفاع في متغيّر واحد: تغييره يحرّك السايدبار والهيدر والمحتوى معاً.
   ------------------------------------------------------------- */
body.has-env-bar {
  --env-bar-h: 34px;
}

.env-bar {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  height: var(--env-bar-h, 34px);
  padding-inline: 14px;
  font-size: 12px;
  font-weight: 700;
  line-height: 1;
  /* لا يلتفّ ولا يمدّ الجسم أفقياً: الالتفاف يضاعف الارتفاع فيخرج
     الشريط عن الإزاحة المحسوبة، والفيض الأفقي إخفاقٌ في الفحص البصري. */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.env-bar .env-bar-note {
  font-weight: 500;
  opacity: .92;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* الجوال: الجملة الشارحة تُطوى ويبقى اسم البيئة — وهو الجزء الذي
   يمنع الخلط. طيّ الاسم وإبقاء الشرح يقلب الأولوية. */
@media (max-width: 640px) {
  .env-bar .env-bar-note { display: none; }
}

/*
   الألوان قيمٌ صريحة لا أصناف Tailwind: البند من معايير القبول التسعة
   («تباين ≥ 4.5:1»)، وكل زوج هنا فوق 9:1 محسوباً. وسلالم Tailwind
   المبنية لا تضمن أن يبقى الزوج مقترناً إن أُعيد بناء الورقة.
*/
.env-bar--warning { background: #fef3c7; color: #78350f; border-bottom: 1px solid #fcd34d; }
.env-bar--info    { background: #e0e7ff; color: #312e81; border-bottom: 1px solid #a5b4fc; }
.env-bar--neutral { background: #e2e8f0; color: #1e293b; border-bottom: 1px solid #cbd5e1; }
.env-bar--danger  { background: #fee2e2; color: #7f1d1d; border-bottom: 1px solid #fca5a5; }

/* --- البوابات الداخلية: مثبَّت، وما تحته يُزاح --- */
body.app-shell.has-env-bar .env-bar {
  position: fixed;
  top: 0;
  right: 0;
  left: 0;
  /* فوق السايدبار (30) والهيدر (25) ودون النافذة المنبثقة (90)
     ولوحة الأوامر (120): الشريط بيانٌ دائم لا طبقةٌ تحجب حواراً. */
  z-index: 45;
}

body.app-shell.has-env-bar .sidebar,
body.app-shell.has-env-bar .app-header {
  top: var(--env-bar-h);
}

body.app-shell.has-env-bar .main-area {
  top: calc(var(--header-h) + var(--env-bar-h));
}

/* --- البوابة العامة والشاشات المجرّدة: لاصق في تدفّق الصفحة --- */
body:not(.app-shell).has-env-bar .env-bar {
  position: sticky;
  top: 0;
  z-index: 45;
}

body:not(.app-shell).has-env-bar .portal-header {
  top: var(--env-bar-h);
}

/* -------------------------------------------------------------
   8) حبر الملاحظات الحالية — معايير القبول §35 (تباين ≥ 4.5:1)
   -------------------------------------------------------------
   الملاحظات الصغيرة تحت خلايا الجداول («تجاوزت مهلتها» · «أُصلحت
   وتنتظر التحقق» · «مرّ موعده ولم يؤكّده أحد») **من شاشاتنا نحن**
   لا من النموذج التصميمي: لا نظير لها في أيٍّ من ملفاته. فتصحيح
   لونها ليس انحرافاً عن «تُنفَّذ بحذافيرها» بل تطبيقٌ للمعيار على
   ما أضفناه.

   والدرجة السادسة في سلّم Tailwind تسقط دون الحدّ على أبيض:
     amber-600  #d97706 → 3.19:1   ✗
     emerald-600 #059669 → 3.77:1  ✗
   والسابعة تجتازه بفارق مريح:
     amber-700  #b45309 → 5.05:1   ✓
     emerald-700 #047857 → 5.55:1  ✓

   قيمٌ سداسية صريحة لا أصناف Tailwind: الصنف الجديد يحتاج إعادة
   بناء الورقة، وطبقةُ المشروع تُصلح النقص بلا خطوة بناء (والقيمة
   المكتوبة هنا لا تنكسر إن أُعيد توليد Tailwind بقائمة بيضاء أضيق).

   ⚠️ ما يبقى دون الحدّ هو أصناف **النموذج** وحدها (`text-slate-400`
   و`text-slate-500` وسطر `sky-600` في شاشة الدخول) — قرارٌ معروض على
   المالك في docs/حالة-التسليم.md، ولا يُتخذ من طرف المنفّذ.
   ------------------------------------------------------------- */
.note-ink-warning { color: #b45309; }
.note-ink-success { color: #047857; }

/* =============================================================
   9) قوائم الهيدر الثلاث — اللغة · الإشعارات · الحساب
   =============================================================
   في `platform.css` لا في `design-system.css`: القوائم الثلاث من
   بناء المشروع لا من النموذج التصميمي (النموذج يعرف قائمة حساب
   بسطرين وشريطَ نشاطٍ تجريبي، ولا يعرف قائمة لغة ولا إشعاراً من
   قاعدة بيانات). والطبقة الأخيرة في ترتيب الأوراق، فتتجاوز ما
   قبلها بلا `!important`.

   ⚠️ ولا صنف Tailwind جديداً في أيٍّ من قواعدها: كل صنف جديد يحتاج
   إعادة بناء الورقة، وطبقةُ المشروع تعمل بلا خطوة بناء. ما استُعمل
   من Tailwind في shell.js مبنيٌّ أصلاً ومستعمَل في القشرة نفسها.
   ============================================================= */

/* ---------- مشترك بين القوائم الثلاث ---------- */

/* عنوان قسمٍ داخل القائمة — يفصل «بوابات أخرى» عمّا قبلها. */
.acct-cap{
  padding:9px 13px 5px;font-size:10px;font-weight:800;color:var(--slate-400);
  text-transform:uppercase;letter-spacing:.06em;
}
.acct-cap-sep{border-top:1px solid var(--slate-100);margin-top:4px;}
.acct-sep{height:1px;background:var(--slate-100);margin:5px 7px;}

/* `.acct-item` في design-system.css `<a>`/`<span>`؛ وهنا صار بعضها `<button>`. */
.acct-dropdown button.acct-item{
  width:100%;background:none;border:0;font:inherit;text-align:start;
}
.acct-item.is-current{color:var(--sky-700);background:var(--sky-50);}

/* علامة الصح في آخر السطر — تعمل في الاتجاهين بلا قاعدة [dir] ثانية. */
.acct-mark{margin-inline-start:auto;color:var(--sky-600);}

/* عدّاد على عنصر القائمة (الإشعارات) — يقرأ لونه من العلامة لا من رمادي ثابت. */
.acct-badge{
  margin-inline-start:auto;min-width:20px;height:18px;padding:0 6px;border-radius:9px;
  background:var(--sky-600);color:#fff;font-size:10.5px;font-weight:800;
  display:inline-flex;align-items:center;justify-content:center;
}

/* البريد تحت الاسم — سطر ثالث في رأس القائمة. */
.acct-mail{
  font-size:11px;color:var(--slate-400);margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;
}

/* ---------- قائمة اللغة ---------- */

/* أضيق من قائمة الحساب: سطرها اسمُ لغةٍ لا عنوانُ شاشة. */
.lang-dropdown{width:216px;}

/* رمز اللغة — «AR» / «EN». حجمٌ ثابت فلا يقفز السطر بين لغةٍ وأخرى. */
.lang-code{
  min-width:26px;height:20px;border-radius:6px;background:var(--slate-100);
  color:var(--slate-600);font-size:10.5px;font-weight:800;letter-spacing:.04em;
  display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;
}
.acct-item.is-current .lang-code{background:var(--sky-100);color:var(--sky-700);}

/* الرمز داخل زرّ الهيدر — أصغر وبلا خلفية، فلا يزاحم الأيقونة. */
.lang-code-btn{
  min-width:0;height:auto;background:none;font-size:9.5px;font-weight:800;
  color:var(--slate-500);
}

/* ---------- قائمة الإشعارات ---------- */

/* عدّاد الجرس — رقمٌ لا نقطة، فيُعرف «كم» قبل الفتح. */
.notif-count{
  position:absolute;top:-2px;inset-inline-end:-2px;
  min-width:17px;height:17px;padding:0 4px;border-radius:9px;
  background:var(--danger-strong,#DC2626);color:#fff;
  font-size:9.5px;font-weight:800;line-height:1;
  display:flex;align-items:center;justify-content:center;
  border:2px solid #fff;
}

.notif-head{
  padding:13px 15px;border-bottom:1px solid var(--slate-100);
  display:flex;align-items:center;justify-content:space-between;gap:10px;
}
.notif-head h3{
  font-size:13.5px;font-weight:800;color:var(--slate-900);
  display:flex;align-items:center;gap:7px;
}
.notif-head-count{
  min-width:20px;height:18px;padding:0 6px;border-radius:9px;
  background:var(--sky-100);color:var(--sky-700);font-size:10.5px;font-weight:800;
  display:inline-flex;align-items:center;justify-content:center;
}
.notif-action{
  background:none;border:0;font:inherit;cursor:pointer;
  display:inline-flex;align-items:center;gap:5px;
  font-size:11.5px;font-weight:700;color:var(--sky-600);
  transition:color var(--t-fast);
}
.notif-action:hover{color:var(--sky-700);text-decoration:underline;}
.notif-action svg{width:12px;height:12px;}

/* ارتفاعٌ محدود بالشاشة لا برقم ثابت: ستة إشعارات على جوالٍ قصير
   تدفع «عرض الكل» خارج المنظور، فلا يجد المستخدم بابه إلى الباقي. */
.notif-list{max-height:min(384px,60vh);overflow-y:auto;padding:5px;}

.notif-item{
  width:100%;background:none;border:0;font:inherit;text-align:start;cursor:pointer;
  display:flex;align-items:flex-start;gap:10px;padding:9px 10px;
  border-radius:var(--r-md);transition:background var(--t-fast);
}
.notif-item:hover{background:var(--slate-50);}
.notif-item.is-static{cursor:default;}
.notif-item.is-static:hover{background:none;}
.notif-item .icon-circle{width:32px;height:32px;margin-top:1px;}

.notif-text{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1;}
.notif-title{font-size:12.5px;font-weight:700;color:var(--slate-800);line-height:1.5;}
.notif-item.is-unread .notif-title{color:var(--slate-900);font-weight:800;}

/* سطران ثم قطع: العنوان يحمل المعنى، والمتن يرجّحه — وثالثٌ يزحم القائمة. */
.notif-line{
  font-size:11.5px;color:var(--slate-500);line-height:1.65;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.notif-time{font-size:10.5px;color:var(--slate-400);}

.notif-dot{
  width:7px;height:7px;border-radius:50%;background:var(--sky-500);
  flex-shrink:0;margin-top:12px;
}

.notif-empty{padding:34px 20px;text-align:center;}
.notif-empty-ic{width:28px;height:28px;color:var(--slate-300);margin:0 auto 10px;display:block;}
.notif-empty-title{font-size:13px;font-weight:800;color:var(--slate-700);}
.notif-empty-hint{font-size:11.5px;color:var(--slate-400);margin-top:4px;line-height:1.7;}

.notif-foot{padding:9px;border-top:1px solid var(--slate-100);text-align:center;}
.notif-foot a{
  display:block;padding:7px;border-radius:var(--r-md);
  font-size:12.5px;font-weight:700;color:var(--sky-600);transition:background var(--t-fast);
}
.notif-foot a:hover{background:var(--sky-50);}

/* -------------------------------------------------------------
   10) مركز الإشعارات — /notifications
   -------------------------------------------------------------
   شاشةٌ من شاشات المشروع لا من النموذج التصميمي، فأصنافها هنا.
   وبادئة `nc-` تميّزها عن `notif-` (قائمة الجرس): الاثنان يعرضان
   الإشعار نفسه بكثافتين مختلفتين، وخلط أصنافهما يجعل تعديل إحداهما
   يغيّر الأخرى بلا قصد.
   ------------------------------------------------------------- */

/* تبويبا «الكل» و«غير المقروء» — رابطان لا زرّان: كلٌّ عنوانٌ يُشارَك. */
.nc-tab{
  display:inline-flex;align-items:center;gap:7px;
  padding:7px 14px;border-radius:var(--r-lg);
  border:1.5px solid var(--slate-200);background:#fff;
  font-size:12.5px;font-weight:700;color:var(--slate-600);
  transition:all var(--t-fast);
}
.nc-tab:hover{border-color:var(--sky-300);color:var(--sky-700);}
.nc-tab.is-on{background:var(--sky-50);border-color:var(--sky-500);color:var(--sky-700);}
.nc-tab-count{
  min-width:19px;height:18px;padding:0 6px;border-radius:9px;
  background:var(--sky-600);color:#fff;font-size:10.5px;font-weight:800;
  display:inline-flex;align-items:center;justify-content:center;
}

.nc-row{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;transition:background var(--t-fast);}
.nc-row:hover{background:var(--slate-50);}

/* شريطٌ على حافة السطر غير المقروء لا خلفيةٌ ملوّنة: الخلفية تتنازع مع
   `:hover` فيبدو المقروء وغيرُ المقروء سواءً تحت المؤشر، والحافة تبقى. */
.nc-row.is-unread{box-shadow:inset 3px 0 0 var(--sky-500);}
[dir="ltr"] .nc-row.is-unread{box-shadow:inset -3px 0 0 var(--sky-500);}

/* -------------------------------------------------------------
   11) ⛔ عطل قاطع: الهيدر كان يقصّ قوائمه المنسدلة
   -------------------------------------------------------------
   `design-system.css` يعطي الهيدر الداخلي:

       body.app-shell .app-header{ position:fixed; height:var(--header-h);
                                   overflow:hidden; }

   والقوائم الثلاث `position:absolute` داخله بـ`top:calc(100% + 10px)`، أي
   **كلّها تحت حدّ الصندوق** ذي الارتفاع الثابت (66px). فـ`overflow:hidden`
   يقصّها بالكامل: الصنف `.show` يُضاف فعلاً، والعنصر موجود في DOM بأبعاده،
   ولا يُرسم منه بكسل واحد.

   ولذلك لم تكن قائمة الحساب تُفتح **قط** في هذا التطبيق — ولا قائمة
   الإشعارات — لا قبل هذه الدفعة ولا بعدها. العطل بصريٌّ صامت: لا خطأ في
   الطرفية، ولا شيء في سجل الخادم، والاختبار الوظيفي يمرّ لأن الحالة في DOM
   صحيحة. وهو ما جعل بناء القوائم يبدو بلا أثر.

   والإصلاح `overflow:visible` لا حذف القاعدة: ما يمنع التفاف صفّ الهيدر هو
   `flex-wrap:nowrap` على `.hdr-row` (والتعليق فوقها في design-system.css
   يقول ذلك)، وما يمنع تمدّد نصوصه هو `min-width:0` مع `truncate` على مسار
   التنقّل و`text-overflow` على شريط البحث — ثلاثتها قائمة ولا تحتاج القصّ.

   في `platform.css` لا في `design-system.css`: الأخير يُتبنّى من النموذج
   كما هو ليبقى قابلاً للتحديث بنسخ مباشر (القرار 6)، وهذه الطبقة آخر ما
   يُبَثّ فتتجاوزه بلا `!important`.
   ------------------------------------------------------------- */
body.app-shell .app-header{ overflow: visible; }

/* الهيدر يصير سياق تكديس بـ`z-index:25`، والسايدبار `z-30` فوقه. والقائمة
   تنسدل في ناحية المحتوى لا ناحية السايدبار، لكن رفعه إلى 26 يضمن ألّا
   تختفي خلفه على أي عرض شاشة — ويبقى دون طبقة الحجاب والدرج (z-40+). */
body.app-shell .app-header{ z-index: 26; }

/* -------------------------------------------------------------
   12) نافذة «شرح الشاشة» — .modal-guide و .guide-*
   -------------------------------------------------------------
   يفتحها زرّ `.value-chip` في الشريط العلوي، ويرسمها
   resources/views/components/screen-guide.blade.php.

   في `platform.css` لا في `design-system.css`: النافذة طبقةُ مشروع لا
   مكوّنَ نموذج، والنموذج يبقى قابلاً للتحديث بنسخٍ مباشر (القرار 6).
   ------------------------------------------------------------- */

/* الشارة صارت `<button>` على الشاشات ذات الدليل. المتصفح لا يورّث خطّ
   الصفحة إلى الأزرار ولا يزيل خلفيتها الافتراضية، و`cursor:help` الموروث
   من `.value-chip` يكذب على زرٍّ يفتح نافذة. */
button.value-chip{ font-family:inherit; cursor:pointer; -webkit-appearance:none; appearance:none; }

/* أوسع من 720px الافتراضية: الدليل عمودان من البطاقات، وعند 720 ينكسر
   العمودان إلى سطرٍ لكل بطاقة فتطول النافذة ويصير التمرير هو القراءة. */
.modal-box.modal-guide{ max-width:860px; }

/* ترويسة ثابتة عند التمرير — وهي حاجةُ هذه النافذة وحدها.
   بقيّة النوافذ نماذجُ قصيرة تُقرأ بلا تمرير، والدليل مستندٌ يتجاوز 90vh
   دائماً: بلا تثبيت يختفي زرّ الإغلاق عند أول تمريرة فلا يبقى للمستخدم إلا
   Escape أو النقر خارجها — وكلاهما لا يعرفه من يفتح النافذة أول مرة.

   `:first-child` لا صنفُ Tailwind: أصناف الترويسة في `<x-modal>` أدواتٌ قد
   تتغيّر بأي تعديل تنسيقي، وموضعُها (أول ابن) هو بنيتها.

   ⚠️ حشوة `p-6` العلوية تُلغى وتُنقل إلى الترويسة نفسها، ولا تُسحب بهامشٍ
   سالب: الهامش السالب مع `top:0` يترك ٢٤ بكسل شفافة فوق الترويسة المثبَّتة
   يمرّ المحتوى المتمرِّر خلالها — عطلٌ ظهر في اللقطة لا في القراءة. */
.modal-box.modal-guide{ padding-top:0; }
.modal-box.modal-guide > :first-child{
  position:sticky; top:0; z-index:2;
  background:#fff;
  margin:0 -24px 16px;
  padding:22px 24px 13px;
  border-bottom:1px solid var(--slate-100);
}

/* الفقرة الافتتاحية — «لماذا وُجدت هذه الشاشة» */
.guide-lead{
  display:flex;align-items:flex-start;gap:11px;
  padding:14px 16px;border-radius:var(--r-xl);
  background:linear-gradient(135deg,#F5F3FF,#EDE9FE);border:1px solid #DDD6FE;
}
.guide-lead p{ font-size:13.5px;line-height:1.9;color:#4C1D95;font-weight:600;margin:0; }
.guide-lead-ic{
  width:30px;height:30px;flex-shrink:0;border-radius:var(--r-lg);
  display:flex;align-items:center;justify-content:center;
  background:#DDD6FE;color:#6D28D9;
}

/* عنوان القسم — الفاصل الوحيد بين أقسام الدليل الثلاثة */
.guide-h{
  display:flex;align-items:center;gap:7px;
  font-size:11.5px;font-weight:800;letter-spacing:.02em;
  color:var(--slate-500);text-transform:uppercase;
}
.guide-h svg{ color:var(--slate-400); }

.guide-card{
  padding:12px 14px;border-radius:var(--r-lg);
  background:var(--slate-50);border:1px solid var(--slate-200);
}
.guide-card-t{ font-size:12.5px;font-weight:800;color:var(--slate-900);margin:0; }
.guide-card-b{ font-size:12.5px;line-height:1.85;color:var(--slate-600);margin:4px 0 0; }

/* خطوات الاستخدام — الرقم في مربّع، والخطّ الرأسي يصل الخطوة بتاليتها */
.guide-steps{ list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px; }
.guide-steps li{ display:flex;align-items:flex-start;gap:11px;padding:9px 2px; }
.guide-step-n{
  width:24px;height:24px;flex-shrink:0;border-radius:8px;
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--sky-600);color:#fff;font-size:11.5px;font-weight:800;
}

.guide-notes{ list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px; }
.guide-notes li{
  position:relative;padding:9px 13px;border-radius:var(--r-lg);
  background:#FFFBEB;border:1px solid #FDE68A;
  font-size:12.5px;line-height:1.85;color:#92400E;font-weight:600;
}

/* -------------------------------------------------------------
   عارض الوثيقة داخل النافذة — ADM-003 تبويب الوثائق
   -------------------------------------------------------------
   المراجع كان يفتح الوثيقة في تبويبٍ ثانٍ ثم يعود ليبتّ فيها، فيفقد
   موضعه في الملف ويقارن من الذاكرة. فالعارض والقرار في نافذةٍ واحدة.

   ولا يمسّ هذا شيئاً من `design-system.css`: `.modal-wide` صنفٌ إضافي
   يُكتب بجانب `.modal-box`، و`platform.css` يُحمَّل بعده فيفوز على
   `max-width` بلا `!important` وبلا تعديل ملف النموذج (القرار 6).
   ------------------------------------------------------------- */

.modal-box.modal-wide{ max-width:1180px; }

/* إطار العرض — ارتفاعٌ ثابت لا يتمدّد بحجم الملف، فتبقى الأزرار مرئية */
.doc-viewer{
  position:relative;
  height:62vh;min-height:320px;
  border-radius:var(--r-xl);
  border:1px solid var(--slate-200);
  background:var(--slate-100);
  overflow:hidden;
}

.doc-viewer > iframe,
.doc-viewer > img{
  width:100%;height:100%;border:0;display:block;
}

/* الصورة تُحتوى ولا تُقصّ: وثيقةُ هويةٍ مقصوصة الحافة تُرفض بلا سبب */
.doc-viewer > img{ object-fit:contain;background:var(--slate-800); }

/* ما لا يعرضه المتصفح (docx وأخواته) — يُقال صراحةً ويُعرض التنزيل */
.doc-viewer-fallback{
  height:100%;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:12px;padding:28px;text-align:center;
}

/* شريط التنقّل بين الوثائق أسفل العارض */
.doc-nav{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  font-size:12px;font-weight:700;color:var(--slate-500);
}

@media (max-width:1024px){
  .doc-viewer{ height:46vh; }
}

/* -------------------------------------------------------------
   شريط التبويبات على الشاشات الصغيرة
   -------------------------------------------------------------
   `.tab-track` في نظام التصميم شريطٌ واحد يتمرّر أفقياً. وخمسة تبويبات في
   390 بكسل تُنتج شريطاً عرضه 409 داخل حاوية 354: نصفُ التبويب الأخير خارج
   الشاشة، واللمسة القريبة من الحافة تقع على جاره — فيفتح المراجع «البيانات»
   وهو يقصد «الوثائق» ولا يفهم لماذا.

   رصدتُه في فحصٍ بصري على 390 بكسل: نقرةٌ برمجية على الزر تعمل، ونقرةٌ
   حقيقية على موضعه تُصيب غيره.

   فالتبويبات تلتفّ سطرين بدل أن تتمرّر، ويُخفى المؤشّر المتحرّك لأنه يُحسب
   لسطرٍ واحد فيقف تحت تبويبٍ غير المختار. والحالة النشطة تبقى مقروءة:
   `.tab-btn.active` ملوَّنٌ بخلفيته أصلاً ولا يعتمد على المؤشّر.

   ولا حرف في `design-system.css` — القرار 6.
   ------------------------------------------------------------- */

@media (max-width: 640px){
  .tab-track{ flex-wrap:wrap; overflow-x:visible; gap:6px; }
  .tab-track .tab-ink{ display:none; }
}

/* -------------------------------------------------------------
   حركة الدخول لا تترك كتلةَ احتواءٍ خلفها
   -------------------------------------------------------------
   `design-system.css` يعطي `body` حركةَ `page-enter`، و`lms.css` يعطي
   `.state-box.on` حركةَ `fade-up` — وكلتاهما بـ`fill-mode: both`.

   وكلتاهما تنتهيان عند `transform: none`، غير أنّ القيمة المحسوبة بعد
   الانتهاء تبقى `matrix(1, 0, 0, 1, 0, 0)` لا `none`: المصفوفة المحايدة
   نتيجةُ استيفاءٍ، والاستيفاء لا يعود بالكلمة المفتاحية. وأيّ مصفوفة —
   ولو محايدة — تجعل العنصر **كتلةَ احتواء** لكل `position: fixed` بداخله.

   وأثرُ ذلك أنّ `.modal-overlay` بـ`inset: 0` داخل المحتوى يُقاس من صندوق
   الصفحة الطويل لا من نافذة المتصفح، فيهبط أسفلها ويحتاج تمريراً ليُرى.
   قيس فعلياً على `/admin/settings/modules`: طبقةٌ ارتفاعها 4567 بكسل
   رأسُها عند 1586‑ بدل 720 من رأس النافذة.

   والعلاج إسقاط `fill-mode` وحده: التأخير صفرٌ في الحركتين فلا حاجة إلى
   `backwards`، وقيمتا النهاية (`opacity: 1` و`transform: none`) هما قيمتا
   الأساس نفسُهما فلا حاجة إلى `forwards`. فالمظهر لا يتغيّر بحرف، وتعود
   القيمة المحسوبة إلى `none` بانتهاء الحركة فتزول كتلة الاحتواء.

   ⚠️ هذا لا يُغني عن دفع النوافذ إلى مكدّس «modals»: المكدّس يضعها شقيقةً
   لـ`.main-area` فلا تتمرّر معها أصلاً، وهو الترتيب المعتمد في القالب.
   ولا حرف في `design-system.css` ولا في `lms.css` — القرار 6.
   ------------------------------------------------------------- */

body,
.state-box.on { animation-fill-mode: none; }

/* -------------------------------------------------------------
   7) منتقي غلاف البرنامج — لون وأيقونة (`admin/programs/_form-fields`)
   -------------------------------------------------------------
   نفس نمط `.radio-card`/`.sup-check` أعلاه: الإدخال مقتصَص بـ`.field-hidden`
   والشكل يتبع `:has(input:checked)` لا صنفاً يضيفه JS — فتعمل حالة الاختيار
   حتى قبل أن يُنفَّذ سطر JavaScript واحد، ويصحّ الاختيار المعروض بعد فشل
   التحقق وإعادة عرض النموذج (`old()`).
   ------------------------------------------------------------- */
.cover-swatch {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  display: inline-block;
  cursor: pointer;
  background: linear-gradient(135deg, var(--c1), var(--c2));
  border: 2.5px solid transparent;
  box-shadow: 0 0 0 1px rgba(15, 23, 42, .08);
  transition: transform var(--t-fast, .15s), box-shadow var(--t-fast, .15s);
}
.cover-swatch:hover { transform: scale(1.08); }
.cover-swatch:has(input:checked) {
  border-color: #fff;
  box-shadow: 0 0 0 2px var(--c2), 0 0 0 4px rgba(15, 23, 42, .08);
}
.cover-swatch:has(input:focus-visible) {
  outline: 3px solid var(--sky-400, #38BDF8);
  outline-offset: 2px;
}

.cover-icon-pick {
  width: 38px;
  height: 38px;
  border-radius: var(--r-md, 10px);
  border: 1.5px solid var(--slate-200);
  background: #fff;
  color: var(--slate-500);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: all var(--t-fast, .15s);
}
.cover-icon-pick .ic { font-size: 15px; }
.cover-icon-pick:hover { border-color: var(--sky-300); background: var(--sky-50); }
.cover-icon-pick:has(input:checked) {
  border-color: var(--sky-500, #0EA5E9);
  background: var(--sky-500, #0EA5E9);
  color: #fff;
}
.cover-icon-pick:has(input:focus-visible) {
  outline: 3px solid var(--sky-400, #38BDF8);
  outline-offset: 2px;
}

.cover-preview { background: var(--slate-100); }
.cover-preview svg { display: block; width: 100%; height: 100%; }
