@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans+Arabic:wght@300;400;500;600;700&family=Aref+Ruqaa:wght@400;700&display=swap');

:root {
  /* هوية مسار: كحلي واثق + فيروزي للتقدّم/الإنجاز */
  --navy-900: #0B1B30;
  --navy-800: #10233F;
  --navy-700: #1B3A5C;
  --teal-600: #0E8C7F;
  --teal-500: #17B8A6;
  --teal-100: #DFF6F2;
  --gold-700: #9A6E13;
  --gold-500: #D4A72C;
  --gold-300: #F3D67D;

  --primary: #0E8C7F;
  --primary-dark: #10233F;
  --primary-light: #DFF6F2;
  --accent: #1B3A5C;
  --danger: #dc2626;
  --danger-light: #fde8e8;
  --warning: #d97706;
  --warning-light: #fef3e0;
  --success: #16a34a;
  --success-light: #e7f7ed;
  --ink: #1E293B;
  --muted: #64748B;
  --border: #DCE3EB;
  --bg: #F1F5F9;
  --card: #ffffff;
  --radius: 10px;
  --shadow: 0 1px 2px rgba(16,24,40,.06), 0 1px 3px rgba(16,24,40,.08);
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: "IBM Plex Sans Arabic", "Segoe UI", Tahoma, "Arial", "DejaVu Sans", sans-serif;
  font-size: 15px;
  line-height: 1.6;
}

body { direction: rtl; }

a { color: inherit; text-decoration: none; }

/* الشريط الجانبي والمحتوى الرئيسي منطقتا تمرير مستقلتان بارتفاع الشاشة بالضبط (بدل ترك المستند/الصفحة
   كلها هي منطقة التمرير الوحيدة الفعلية) — قبل هذا الإصلاح كان الشريط الجانبي "sticky" فقط، فإن لم يفض
   محتواه عمليًا عن ارتفاع الشاشة (أو عند تمرير عجلة الفأرة فوقه بعد وصوله لحده) كانت أحداث العجلة تُمرَّر
   (chaining) لمستند الصفحة نفسه فتُحرِّك المحتوى الأوسط بدل الشريط الجانبي المعروض تحت المؤشر فعليًا —
   وهذا بالضبط ما كان يُلاحَظ. overscroll-behavior: contain يمنع "تسرّب" التمرير من صندوق لآخر، وبقاء
   html/body بلا overflow خاص بهما يجعل حاسوب اتجاه شريط تمرير كل صندوق (RTL) يعتمد فقط على direction
   الموروث لكل صندوق بمفرده، فتظهر أشرطة التمرير في مكانها الصحيح: شريط تمرير المحتوى الأوسط في أقصى
   يسار الشاشة (حافة الصفحة)، وشريط تمرير الشريط الجانبي ملاصقًا للحد الفاصل بينه وبين المحتوى — عكس
   الترتيب الخاطئ السابق تمامًا. */
/* overflow:hidden على .app-shell نفسه لا على html/body — يقصر الأثر على صفحات لوحة التحكم (التي
   تستخدم هذا الهيكل) فقط، ولا يمس صفحات الطباعة أو صفحة الدخول أو بوابة ولي الأمر (تستخدم style.css
   نفسه لكن بلا .app-shell)، فتبقى تلك الصفحات تمرِّر المستند بشكل طبيعي كما كانت دومًا. */
.app-shell { display: flex; height: 100vh; overflow: hidden; }

/* الشريط الجانبي */
.sidebar {
  width: 250px;
  flex-shrink: 0;
  background: linear-gradient(180deg, var(--primary-dark), var(--primary));
  color: #fff;
  padding: 18px 14px;
  height: 100%;
  overflow-y: auto;
  overscroll-behavior: contain;
  transition: width .18s ease, padding .18s ease, opacity .18s ease;
}
/* إخفاء الشريط الجانبي (v38) — الكلاس يُضاف على <html> (لا .app-shell) لأنه يُطبَّق من سكربت مباشر في
   أول <body> قبل رسم الصفحة (راجع base.html)؛ عنصر <html> متاح فورًا في تلك اللحظة بخلاف عناصر لم تُرسَم
   بعد. يُخفى الشريط بعرض 0 (لا display:none حتى يبقى قابلاً للانتقال السلس)، ويتمدد المحتوى ليملأ المساحة. */
html.sidebar-collapsed .sidebar {
  width: 0; padding-left: 0; padding-right: 0; opacity: 0; overflow: hidden; pointer-events: none;
}
.icon-btn {
  display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px;
  flex-shrink: 0; border: 1px solid var(--border); border-radius: 8px; background: var(--card);
  color: var(--navy-800); cursor: pointer; transition: background .12s ease, border-color .12s ease;
}
.icon-btn:hover { background: var(--teal-100); border-color: var(--teal-500); }
.topbar-start { display: flex; align-items: center; gap: 12px; min-width: 0; }
.sidebar .brand {
  font-size: 20px;
  font-weight: 700;
  padding: 8px 10px 20px;
  display: flex;
  align-items: center;
  gap: 8px;
}
.sidebar .brand small { display:block; font-size: 11px; font-weight: 400; opacity: .85; }
.brand-icon { flex-shrink: 0; }
/* line-height معقول + overflow: visible ضروريان هنا: خط "Aref Ruqaa" خط زخرفي (رقعة) بزوائد/تعرجات
   تمتد فوق وتحت خط الأساس أكثر من الخطوط العادية، فإن كان ارتفاع السطر ضيقًا جدًا (line-height: 1
   كما كان سابقًا) مع vertical-align سالب لدفع النص للأسفل، تُقصّ أطراف بعض الحروف (خصوصًا الميم
   والياء) خارج مربع السطر فتصبح غير مرئية. الحل: مساحة رأسية كافية بدل الاعتماد على إزاحة سالبة.
   كذلك word-spacing إضافي ضروري لفصل "مازن" عن "السحيمي" بصريًا: خط Ruqaa المتصل (الرقعة) يجعل
   تعرجات نهاية الكلمة الأولى تتداخل بصريًا مع بداية الكلمة الثانية عند التلاصق المعتاد، فيصبح الاسم
   غير واضح للقراءة — التباعد الإضافي يفصلهما بوضوح دون كسر الطابع الخطي المتصل داخل كل كلمة. */
.dev-credit { font-size: 11px; color: var(--muted); text-align: center; line-height: 2.2; overflow: visible; }
.sidebar .dev-credit { padding: 10px 10px 18px; }
.dev-credit .signature-name {
  font-family: "Aref Ruqaa", "IBM Plex Sans Arabic", serif;
  font-weight: 700;
  font-size: 27px;
  line-height: 2.2;
  /* لون ذهبي بارز (بدل التدرج الفيروزي/الكحلي السابق الذي كان يذوب داخل خلفية الشريط الجانبي الداكنة
     نفسها تقريبًا) — يظهر بوضوح على الخلفية الداكنة (الشريط الجانبي) والفاتحة (بطاقة صفحة الدخول) معًا. */
  background: linear-gradient(90deg, var(--gold-700), var(--gold-300));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  text-shadow: 0 1px 1px rgba(0, 0, 0, .18);
  display: inline-block;
  margin-inline-start: 5px;
  word-spacing: 6px;
  letter-spacing: .3px;
  padding: 4px 2px;
  overflow: visible;
  white-space: nowrap;
}
.sidebar .dev-credit .signature-name { font-size: 21px; word-spacing: 4px; }
.sidebar nav a {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  border-radius: 8px;
  color: rgba(255,255,255,.9);
  font-size: 14px;
  margin-bottom: 3px;
  transition: background .15s;
}
.sidebar nav a:hover { background: rgba(255,255,255,.12); }
.sidebar nav a.active { background: rgba(255,255,255,.22); font-weight: 600; }
/* عناوين أقسام الشريط الجانبي: كانت شبه مخفية (لون باهت جدًا opacity:.6 وخط صغير 11px بلا أي حدود
   تميّزها عن روابط الأقسام)، فيصعب تمييز بداية كل قسم بصريًا أثناء التمرير السريع. الآن: خط أوضح حجمًا
   ووزنًا، لون ذهبي هوية العلامة (يبرز على خلفية الشريط الداكنة كما في توقيع المطوّر)، وإطار خفيف مع خلفية
   شبه شفافة يفصل بصريًا كل قسم كصندوق عنوان قائم بذاته بدل نص باهت يذوب بين الروابط. */
.sidebar .section-label {
  font-size: 12.5px;
  font-weight: 700;
  color: var(--gold-300);
  opacity: 1;
  margin: 18px 6px 8px;
  padding: 6px 10px;
  letter-spacing: .02em;
  border: 1px solid rgba(255,255,255,.28);
  border-radius: 7px;
  background: rgba(255,255,255,.07);
  display: block;
}
.sidebar .section-label:first-child { margin-top: 4px; }
/* عنوان فرعي داخل قسم رئيسي (مثال: "استيراد جدول جاهز" و"بناء الجدول يدويًا" داخل قسم "الجدول
   المدرسي") — أخف وزنًا من عنوان القسم الرئيسي (بلا صندوق/إطار كامل) لكنه لا يزال واضحًا ومائلاً قليلاً
   للداخل (شريط تمييز رفيع على الحافة اليمنى في RTL) لإظهار التبعية البصرية للقسم الرئيسي فوقه. */
.sidebar .section-sublabel {
  font-size: 11.5px;
  font-weight: 600;
  color: var(--teal-100);
  opacity: .92;
  margin: 12px 6px 6px 10px;
  padding-right: 8px;
  border-right: 2px solid rgba(255,255,255,.35);
  letter-spacing: .02em;
}
.sidebar .duty-badge {
  display: inline-block;
  min-width: 18px;
  padding: 1px 6px;
  margin-inline-start: 6px;
  border-radius: 999px;
  background: var(--gold-500);
  color: var(--navy-900);
  font-size: 11px;
  font-weight: 700;
  text-align: center;
  line-height: 1.6;
}
.sidebar .icon { width: 18px; text-align: center; display: inline-flex; align-items: center; justify-content: center; }

/* مجموعة أيقونات SVG المضمَّنة الموحّدة (البند 7) — تستبدل كل الرموز التعبيرية (emoji) القديمة عبر
   النظام. كل أيقونة `<svg class="icon-svg">` ترث لونها من النص المحيط تلقائيًا (currentColor)، فتعمل بلا
   أي تعديل إضافي داخل الشريط الجانبي الداكن، الأزرار الملوّنة، أو النص العادي. */
.icon-svg { display: inline-block; vertical-align: -4px; flex-shrink: 0; }
.section-label .icon-svg, .section-sublabel .icon-svg { width: 14px; height: 14px; vertical-align: -2px; }
.period-clock-label .icon-svg { width: 15px; height: 15px; vertical-align: -3px; }
.empty-state .icon .icon-svg { width: 40px; height: 40px; }
h2 .icon-svg, h3 .icon-svg { vertical-align: -5px; }
.btn .icon-svg, .btn-sm .icon-svg { vertical-align: -3px; }

/* عدّاد "الحصة الحالية" التنازلي (v25) — يظهر أعلى الشريط الجانبي (فوق توقيع المطوّر) لكل الأدوار
   الموظَّفة حين تكون المدرسة ضمن دوامها الفعلي (حصة أو فسحة جارية)؛ العدّ التنازلي نفسه بجافاسكربت خالص
   في app.js (initPeriodClock)، تحديثه كل ثانية بلا أي طلب خادم إضافي. */
.period-clock {
  margin: 4px 10px 10px;
  padding: 10px 12px;
  border-radius: 10px;
  background: rgba(255,255,255,.08);
  border: 1px solid rgba(255,255,255,.18);
  text-align: center;
}
.period-clock-label {
  font-size: 12px;
  font-weight: 600;
  color: var(--teal-100);
  margin-bottom: 2px;
}
.period-clock-timer {
  font-size: 22px;
  font-weight: 700;
  color: #fff;
  direction: ltr;
  letter-spacing: .03em;
}
/* آخر دقيقتان من الحصة/الفسحة: لون تحذيري لافت (نفس أسلوب شارات الخطر الحمراء في النظام) لتنبيه
   المستخدم بصريًا أن الوقت أوشك على الانتهاء دون الحاجة لقراءة الرقم بتمعّن. */
.period-clock.period-clock-warning .period-clock-timer { color: #FF6B6B; }
.period-clock.period-clock-ended .period-clock-timer { color: rgba(255,255,255,.5); font-size: 16px; }

/* المحتوى الرئيسي */
.main {
  flex: 1;
  min-width: 0;
  height: 100%;
  display: flex;
  flex-direction: column;
}
.topbar {
  flex-shrink: 0;
  background: var(--card);
  border-bottom: 1px solid var(--border);
  padding: 12px 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.topbar .page-title { font-size: 18px; font-weight: 700; }
.topbar .user-chip {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 14px;
}
.topbar .user-chip .role-badge {
  background: var(--primary-light);
  color: var(--primary-dark);
  padding: 2px 10px;
  border-radius: 20px;
  font-size: 12px;
  font-weight: 600;
}
/* صندوق التمرير الفعلي الثاني (راجع الملاحظة أعلى .sidebar) — يملأ ما تبقى من ارتفاع .main بعد
   .topbar الثابت، ويمرِّر محتواه بمعزل تام عن الشريط الجانبي. */
.content {
  flex: 1;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: 22px 24px;
  max-width: 1400px;
  width: 100%;
  margin: 0 auto;
}

/* شريط الأخبار المتحرك بلوحة التحكم (v25/البند 12) — يظهر أعلى محتوى لوحة تحكم المدير/الوكيل فقط، بنفس
   هوية الشريط الجانبي الكحلية (period-clock) ليبدو جزءًا متجانسًا من واجهة النظام لا عنصرًا دخيلًا. */
.activity-ticker {
  display: flex;
  align-items: center;
  gap: 14px;
  background: var(--navy-800);
  border: 1px solid var(--navy-700);
  border-radius: var(--radius);
  padding: 10px 16px;
  margin-bottom: 18px;
  box-shadow: var(--shadow);
}
.activity-ticker-label {
  flex-shrink: 0;
  font-size: 13px;
  font-weight: 700;
  color: var(--teal-100);
  padding-inline-end: 14px;
  border-inline-end: 1px solid rgba(255,255,255,.18);
  white-space: nowrap;
}
.activity-ticker-track-wrap {
  flex: 1;
  min-width: 0;
  overflow: hidden;
}
.activity-ticker-track {
  display: flex;
  align-items: center;
  width: max-content;
  will-change: transform;
}
.activity-ticker-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: #fff;
  text-decoration: none;
  font-size: 13px;
  white-space: nowrap;
  padding-inline-end: 28px;
  transition: opacity .15s;
}
.activity-ticker-item:hover { opacity: .8; text-decoration: underline; }
.activity-ticker-icon { font-size: 14px; }
.activity-ticker-time {
  color: var(--teal-100);
  font-size: 12px;
  direction: ltr;
}
.activity-ticker-empty {
  color: rgba(255,255,255,.6);
  cursor: default;
}
.activity-ticker-empty:hover { opacity: 1; text-decoration: none; }

/* بطاقات */
.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 20px;
  margin-bottom: 18px;
}
.card-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 14px;
}
.card-header h2, .card-header h3 { margin: 0; font-size: 16px; }

.grid { display: grid; gap: 16px; }
.grid-2 { grid-template-columns: repeat(2, 1fr); }
.grid-3 { grid-template-columns: repeat(3, 1fr); }
.grid-4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 900px) {
  .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr 1fr; }
}

/* إحصائيات */
.stat-tile {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 16px 18px;
  box-shadow: var(--shadow);
}
.stat-tile .value { font-size: 26px; font-weight: 800; color: var(--primary-dark); }
.stat-tile .label { color: var(--muted); font-size: 13px; margin-top: 4px; }
.stat-tile.danger .value { color: var(--danger); }
.stat-tile.warning .value { color: var(--warning); }
.stat-tile.success .value { color: var(--success); }

/* أزرار */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border: 1px solid transparent;
  border-radius: 8px;
  padding: 9px 16px;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  background: var(--primary);
  color: #fff;
}
.btn:hover { background: var(--primary-dark); }
.btn.btn-secondary { background: #fff; color: var(--ink); border-color: var(--border); }
.btn.btn-secondary:hover { background: #f3f4f6; }
.btn.btn-danger { background: var(--danger); }
.btn.btn-danger:hover { background: #b91c1c; }
.btn.btn-success { background: var(--success); }
.btn.btn-outline { background: transparent; color: var(--primary); border-color: var(--primary); }
.btn.btn-sm { padding: 5px 10px; font-size: 12.5px; }
.btn[disabled] { opacity: .5; cursor: not-allowed; }
.btn-group { display: flex; gap: 8px; flex-wrap: wrap; }

/* نماذج */
.form-group { margin-bottom: 14px; }
label { display: block; font-size: 13.5px; font-weight: 600; margin-bottom: 6px; color: #374151; }
input[type=text], input[type=password], input[type=date], input[type=tel],
input[type=number], input[type=search], input[type=email], select, textarea {
  width: 100%;
  padding: 9px 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  font-size: 14px;
  font-family: inherit;
  background: #fff;
  color: var(--ink);
}
textarea { resize: vertical; min-height: 80px; }
input:focus, select:focus, textarea:focus {
  outline: none;
  border-color: var(--primary);
  box-shadow: 0 0 0 3px var(--primary-light);
}
.form-row { display: flex; gap: 14px; flex-wrap: wrap; }
.form-row > * { flex: 1; min-width: 180px; }
.help-text { font-size: 12.5px; color: var(--muted); margin-top: 4px; }
.checkbox-row { display: flex; align-items: center; gap: 8px; }
.checkbox-row input { width: auto; }

/* جداول */
.table-wrap { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
th, td { padding: 10px 12px; text-align: right; border-bottom: 1px solid var(--border); white-space: nowrap; }
th { background: #f9fafb; font-weight: 700; color: #374151; position: sticky; top: 0; }
tr:hover td { background: #fafbfb; }
td.wrap, th.wrap { white-space: normal; }

/* شبكة بناء الجدول الدراسي */
.schedule-grid th, .schedule-grid td { text-align: center; white-space: normal; }
.schedule-grid td select { width: 100%; min-width: 130px; font-size: 12.5px; padding: 6px 4px; }
/* خانة "لا حصة لهذا اليوم أصلاً" (v22 — عدد الحصص يختلف بين الأيام/المراحل الآن) — تمييز بصري واضح عن
   خانة "حصة فارغة فعليًا لكنها موجودة ضمن جدول اليوم" حتى لا يُظن أنها مجرد حصة غير مُسندة بعد. */
.na-cell {
  background: repeating-linear-gradient(135deg, #eef1f5, #eef1f5 4px, #e2e6ec 4px, #e2e6ec 8px);
  color: var(--muted);
}

/* الشبكة العامة للتسكين اليدوي (master grid) — إعادة تصميم بصري احترافي (v37): تمريران ثابتان (عمود
   اسم المعلم + صفَّا الترويسة)، تمييز أيام متبادل بحدود أعرض بين المجموعات، ألوان متسقة مع هوية "مسار"
   (فيروزي/كحلي/ذهبي) بدل الألوان العامة السابقة، وحالات تفاعل أوضح (تحديد/هدف/تحويم) بدون أي تغيير في
   منطق JS القائم — كل أسماء الكلاسات (cell-filled/cell-duty/cell-locked/cell-empty/mg-selected/mg-target/
   mg-teacher-name/mg-code/mg-remove) بقيت كما هي بالضبط ليستمر عمل السحب/الإفلات والتحديد دون أي تعديل. */
.master-grid-table { border-collapse: separate; border-spacing: 0; }
.master-grid-table th, .master-grid-table td {
  padding: 7px 6px; font-size: 12.5px; border: 1px solid var(--border); white-space: nowrap;
}
.master-grid-table thead th {
  position: sticky; z-index: 3; background: #f4f6f9; color: var(--navy-800); font-weight: 700;
  height: 34px; box-shadow: inset 0 -1px 0 var(--border);
}
.master-grid-table thead tr:first-child th { top: 0; }
.master-grid-table thead tr:last-child th { top: 34px; font-weight: 600; color: var(--muted); }
.master-grid-table thead tr:first-child th:not(:first-child) {
  background: var(--navy-800); color: #fff; border-color: var(--navy-700);
}
/* عمود اسم المعلم مثبَّت أفقيًا (يمين، لغة RTL) ورأسيًا معًا — يبقى ظاهرًا دومًا مهما طال التمرير في
   شبكة بهذا الاتساع (عشرات الأعمدة لأيام/حصص المدرسة كاملة). */
.master-grid-table th:first-child,
.master-grid-table td.mg-teacher-name {
  position: sticky; right: 0; z-index: 2; background: var(--card);
  box-shadow: inset -1px 0 0 var(--border);
}
.master-grid-table thead th:first-child { z-index: 4; background: #f4f6f9; }
.master-grid-table td.mg-teacher-name {
  text-align: right; font-weight: 700; color: var(--navy-800); min-width: 130px; max-width: 170px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.master-grid-table tbody tr:nth-child(even) td:not(.mg-teacher-name) { background: #fafbfd; }
.master-grid-table tbody tr:nth-child(even) td.mg-teacher-name { background: #fafbfd; }
.master-grid-table tbody tr:hover td { background: var(--teal-100); }
.master-grid-table tbody tr:hover td.mg-teacher-name { background: var(--teal-100); }
/* فاصل بصري أعرض بين مجموعات الأيام (أول عمود حصة لكل يوم) لتسهيل قراءة الشبكة الكبيرة دفعة واحدة. */
.master-grid-table td.mg-day-start, .master-grid-table th.mg-day-start {
  border-right-width: 2px; border-right-color: var(--navy-700);
}

.master-grid-table td.cell-filled, .master-grid-table td.cell-duty {
  position: relative; font-weight: 700; min-width: 48px; border-radius: 6px;
  background-clip: padding-box; transition: transform .1s ease, box-shadow .1s ease;
}
.master-grid-table td.cell-filled { background: var(--teal-100); color: var(--teal-600); cursor: pointer; }
.master-grid-table td.cell-filled:hover { box-shadow: 0 0 0 2px var(--teal-500) inset; transform: translateY(-1px); }
.master-grid-table td.cell-duty { background: #fbf3da; color: var(--gold-700); }
.master-grid-table .mg-code { pointer-events: none; letter-spacing: .2px; }
.master-grid-table .mg-remove {
  position: absolute; top: 2px; left: 2px; width: 15px; height: 15px; line-height: 13px; padding: 0;
  border: none; border-radius: 50%; background: rgba(16,35,63,.15); color: inherit; font-size: 11px;
  cursor: pointer; opacity: 0; transition: opacity .12s ease, background .12s ease;
}
.master-grid-table td.cell-filled:hover .mg-remove,
.master-grid-table td.cell-duty:hover .mg-remove { opacity: 1; }
.master-grid-table .mg-remove:hover { background: var(--danger); color: #fff; }
.master-grid-table td.cell-locked {
  background: repeating-linear-gradient(135deg, #eef1f5, #eef1f5 4px, #e2e6ec 4px, #e2e6ec 8px);
  color: var(--muted); border-radius: 6px;
}
.master-grid-table td.cell-empty { color: var(--muted); border-radius: 6px; }
.master-grid-table td.cell-empty a {
  display: flex; align-items: center; justify-content: center; width: 100%; min-height: 20px;
  text-decoration: none; color: var(--border); font-weight: 700; font-size: 15px; border-radius: 6px;
  transition: color .12s ease, background .12s ease;
}
.master-grid-table td.cell-empty a:hover { color: var(--teal-600); background: var(--teal-100); }

/* وضع التبديل: خانة مصدر مُحدَّدة (اضغط عليها مجددًا لإلغاء التحديد)، وخانات هدف صالحة (نفس صف المعلم، أو
   معلم آخر مؤهَّل) — البند المطلوب: "تبديل حصة مكان حصة". تعمُّد استخدام **تعبئة لونية كاملة** هنا (لا
   إطار/ظل خفيف كالمحاولة الأولى) لأن الإطار الرفيع كان يتشابه بصريًا مع لون خلفية الخانات المُسكَّنة
   (الفيروزي الفاتح) عند نظرة سريعة — التعبئة الكاملة تكسر هذا التشابه فورًا بلا أي لبس، بصرف النظر عن حالة
   الخانة الأصلية (مُسكَّنة/انتظار/فارغة). **وضعت هذه القواعد عمدًا في نهاية الملف بعد كل قواعد حالات الخانة
   الأخرى** (بما فيها `.cell-empty a:hover`) رغم تساوي التخصيص (specificity) بينها جميعًا، لتضمن الفوز
   دومًا بترتيب التتابع (declaration order) — لو بقيت أعلى الملف كسابقًا لكانت قاعدة تحويم الخانة الفارغة
   الأحدث تكتب فوقها لون التحويم الفيروزي القديم بدل الأبيض حين تكون الخانة هدفًا فارغًا. */
.master-grid-table td.mg-selected {
  background: var(--navy-700); color: #fff; box-shadow: 0 2px 8px rgba(16,35,63,.4); z-index: 2;
  border-radius: 6px;
}
.master-grid-table td.mg-selected .mg-code { color: #fff; }
.master-grid-table td.mg-target {
  cursor: pointer; background: var(--success); color: #fff; border-radius: 6px; z-index: 1;
  animation: mg-target-pulse 1.4s ease-in-out infinite;
}
.master-grid-table td.mg-target .mg-code,
.master-grid-table td.mg-target a { color: #fff; }
.master-grid-table td.mg-target a:hover { color: #fff; background: transparent; }
@keyframes mg-target-pulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(22,163,74,.6); }
  50% { box-shadow: 0 0 0 5px rgba(22,163,74,0); }
}

/* شريط مفتاح الألوان (Legend) أعلى الشبكة — يوضّح معنى كل حالة خانة بصريًا قبل الدخول في الشبكة الكبيرة. */
.mg-legend {
  display: flex; flex-wrap: wrap; gap: 14px; align-items: center; margin-bottom: 14px; padding: 10px 14px;
  background: #f9fafb; border: 1px solid var(--border); border-radius: var(--radius); font-size: 12.5px;
  color: var(--ink);
}
.mg-legend-item { display: flex; align-items: center; gap: 6px; }
.mg-legend-swatch {
  display: inline-block; width: 16px; height: 16px; border-radius: 4px; flex-shrink: 0;
  border: 1px solid rgba(0,0,0,.06);
}
.mg-legend-swatch.filled { background: var(--teal-100); box-shadow: inset 0 0 0 2px var(--teal-500); }
.mg-legend-swatch.duty { background: #fbf3da; box-shadow: inset 0 0 0 2px var(--gold-500); }
.mg-legend-swatch.locked { background: repeating-linear-gradient(135deg, #eef1f5, #eef1f5 4px, #e2e6ec 4px, #e2e6ec 8px); }
.mg-legend-swatch.empty { background: #fff; box-shadow: inset 0 0 0 1px var(--border); }
.mg-legend-swatch.selected { background: var(--navy-700); }
.mg-legend-swatch.target { background: var(--success); }

/* شارات */
.badge { display: inline-block; padding: 3px 10px; border-radius: 20px; font-size: 12px; font-weight: 700; }
.badge.d1, .badge.d2 { background: var(--success-light); color: var(--success); }
.badge.d3 { background: var(--warning-light); color: var(--warning); }
.badge.d4, .badge.d5 { background: var(--danger-light); color: var(--danger); }
.badge.gray { background: #f3f4f6; color: #4b5563; }
.badge.blue { background: #e0edff; color: var(--accent); }
.badge.green { background: var(--success-light); color: var(--success); }
.badge.orange { background: var(--warning-light); color: var(--warning); }
.badge.red { background: var(--danger-light); color: var(--danger); }

/* تنبيهات */
.alert { padding: 12px 16px; border-radius: 8px; margin-bottom: 14px; font-size: 14px; }
.alert.error { background: var(--danger-light); color: #991b1b; border: 1px solid #fca5a5; }
.alert.success { background: var(--success-light); color: #14532d; border: 1px solid #86efac; }
.alert.info { background: #e0edff; color: #1e3a8a; border: 1px solid #93c5fd; }

/* تسجيل الدخول */
.login-page {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(135deg, var(--navy-800), var(--teal-600) 60%, var(--teal-500));
}
.login-card {
  background: #fff;
  width: 100%;
  max-width: 400px;
  padding: 34px 30px;
  border-radius: 14px;
  box-shadow: 0 20px 50px rgba(0,0,0,.25);
}
.login-card .brand-title {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  text-align: center;
  font-size: 24px;
  font-weight: 800;
  color: var(--navy-800);
  margin-bottom: 4px;
}
.login-card .brand-sub { text-align: center; color: var(--muted); font-size: 13px; margin-bottom: 26px; }
.demo-accounts { margin-top: 18px; font-size: 12.5px; color: var(--muted); background: #f9fafb; border-radius: 8px; padding: 10px 12px; }
.demo-accounts b { color: var(--ink); }

.empty-state { text-align: center; padding: 40px 20px; color: var(--muted); }
.empty-state .icon { font-size: 40px; margin-bottom: 10px; }

.tabs { display: flex; gap: 6px; border-bottom: 1px solid var(--border); margin-bottom: 18px; }
.tabs a { padding: 10px 16px; font-size: 14px; font-weight: 600; color: var(--muted); border-bottom: 2px solid transparent; }
.tabs a.active { color: var(--primary-dark); border-color: var(--primary); }

.pill-select { display: flex; gap: 8px; flex-wrap: wrap; }
.pill-select label {
  display: flex; align-items: center; gap: 6px;
  border: 1px solid var(--border); border-radius: 20px; padding: 6px 12px;
  font-weight: 500; font-size: 13px; cursor: pointer;
}

.text-muted { color: var(--muted); }
.text-danger { color: var(--danger); }
.text-success { color: var(--success); }
.mt-0 { margin-top: 0; }
.mb-0 { margin-bottom: 0; }
.flex { display: flex; }
.flex-between { display: flex; align-items: center; justify-content: space-between; }
.gap-8 { gap: 8px; }
.small { font-size: 12.5px; }

/* حجم صفحة A4 فعليًا عند الطباعة (بدل الاعتماد على إعداد الطابعة الافتراضي الذي قد يكون Letter) */
@page {
  size: A4;
  margin: 12mm 10mm;
}

@media print {
  .no-print { display: none !important; }
  /* بعض قوالب الطباعة تضع padding/background كخاصية inline على body (لأغراض المعاينة قبل
     الطباعة)؛ يجب إلغاؤها بالكامل عند الطباعة الفعلية وإلا تُضاف فوق هوامش @page فتفيض
     الصفحة إلى صفحة ثانية شبه فارغة لا تحوي إلا شريط التذييل */
  body { background: #fff !important; margin: 0 !important; padding: 0 !important; }
  .print-sheet {
    box-shadow: none;
    border: none;
    max-width: none;
    width: 100%;
    /* ارتفاع منطقة المحتوى داخل صفحة A4 بعد طرح هوامش @page أعلاه (297mm - 24mm) */
    min-height: 273mm;
    display: flex;
    flex-direction: column;
    padding-bottom: 0;
  }
  /* تثبيت شريط تذييل الوزارة في أسفل الصفحة الفعلي دائمًا (بدل ظهوره مباشرة بعد نهاية المحتوى
     تاركًا فراغًا كبيرًا أسفله) عبر دفعه بكامل المساحة المتبقية في عمود flex */
  .moe-footer-bar { margin-top: auto !important; }
}

.print-sheet {
  background: #fff;
  max-width: 780px;
  margin: 0 auto;
  padding: 0 0 30px;
  border: 1px solid var(--border);
  border-radius: 8px;
  /* overflow:hidden كانت هنا سابقًا لقصّ حواف الظل/الزوايا المدوّرة فقط، لكنها كانت تُخفي بصمت أي
     محتوى (اسم طويل، نص جدول) يفيض عن عرض 780px بدل التفافه — الآن overflow:visible + كسر كلمات
     الجداول أدناه يمنعان أي قصّ غير مقصود لجزء من محتوى الصفحة عند العرض أو الطباعة. */
  overflow: visible;
}
.print-sheet table td, .print-sheet table th { word-wrap: break-word; overflow-wrap: break-word; }
.print-sheet h1 { text-align: center; font-size: 20px; }
.print-sheet .logo-row { display:flex; justify-content: space-between; font-size: 13px; margin-bottom: 20px; }
.print-sheet .sig-row { display:flex; justify-content: space-between; margin-top: 60px; }
.print-sheet table { margin-top: 10px; }
.print-sheet table td, .print-sheet table th { border: 1px solid #ccc; }
.print-sheet .sheet-body { padding: 10px 50px 0; }

/* ترويسة على غرار الهوية البصرية لنماذج وزارة التعليم الرسمية (بالشعار الرسمي الفعلي) */
.moe-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  padding: 34px 50px 18px;
  gap: 16px;
}
/* مربع "المنطقة/المحافظة" و"المدرسة": كان min-width:170px للحاوية مع .fill-line العام (min-width:160px،
   مُعدّ أصلًا لحقول تعبئة داخل متن النماذج، لا لهذا الركن الضيق) يكاد يضمن التفاف كل قيمة غير قصيرة جدًا
   على سطر مستقل ملتصق بالسطر التالي بلا أي مسافة — يظهر "متقاربًا" جدًا خصوصًا لأسماء إدارات/مدارس
   طويلة. الحل: حاوية أعرض، بلا حد أدنى لعرض القيمة نفسها (تتمدد بحسب الحاجة فقط)، مسافة واضحة بين
   السطرين، ومحاذاة وسط بدل يمين لتبدو متوازنة بصريًا حتى عند الالتفاف لسطرين. */
.moe-header .school-fields { font-size: 12.5px; line-height: 1.7; min-width: 205px; max-width: 240px; text-align: center; }
.moe-header .school-fields > div { margin-bottom: 8px; }
.moe-header .school-fields > div:last-child { margin-bottom: 0; }
.moe-header .school-fields b { color: var(--primary-dark); }
.moe-header .school-fields .fill-line { min-width: 0; }
.moe-header .moe-logo { text-align: center; flex-shrink: 0; }
.moe-header .moe-logo img { width: 92px; }
.moe-header .kingdom-title { font-size: 13.5px; text-align: center; font-weight: 700; line-height: 1.9; color: var(--ink); min-width: 170px; }
.print-sheet .form-title {
  text-align: center;
  font-size: 19px;
  font-weight: 800;
  color: var(--primary-dark);
  margin: 10px 0 18px;
  padding-bottom: 10px;
  border-bottom: 2px solid var(--primary-light);
}
.print-sheet .confidential-tag {
  text-align: center;
  font-size: 12px;
  font-weight: 700;
  color: var(--danger);
  margin-bottom: 4px;
}
.print-sheet .fill-line { border-bottom: 1px dotted #999; display: inline-block; min-width: 160px; padding: 0 4px; }
.print-sheet .field-row { margin: 10px 0; font-size: 14px; }
.print-sheet .witness-table th, .print-sheet .witness-table td { text-align: center; height: 26px; }
/* جدول إجراءات الغياب المعبأ تلقائيًا بنص الدليل الرسمي: النصوص طويلة فقرات، فيجب أن تُلتف على
   عدة أسطر بدل قاعدة nowrap العامة، وارتفاع الصف يجب أن يتمدد بحسب المحتوى لا 26px ثابتة */
.print-sheet .procedure-table th, .print-sheet .procedure-table td { white-space: normal; height: auto; vertical-align: top; }
.print-sheet .procedure-table th { vertical-align: middle; text-align: center; }
/* عند الطباعة على أكثر من صفحة (نصوص طويلة)، يُفضَّل انتقال الصف كاملاً للصفحة التالية بدل تقطيعه
   منتصفه بخط فاصل الصفحة */
.print-sheet table tr { break-inside: avoid; page-break-inside: avoid; }

.moe-footer-bar { margin-top: 34px; }
.moe-footer-bar img { width: 100%; display: block; }

/* شبكة التوقيعات (مدير المدرسة / ولي الأمر / الطالب) */
.sign-grid { display: flex; gap: 18px; margin-top: 34px; }
.sign-grid .sign-col { flex: 1; font-size: 13px; }
.sign-grid .sign-col-label { font-weight: 700; margin-bottom: 8px; color: var(--primary-dark); }
.sign-grid .sign-field { margin-bottom: 8px; }
.sign-grid-2 .sign-col { flex: 1; }
.sign-grid-2 .seal-col { display: flex; align-items: center; justify-content: center; font-weight: 700; color: var(--muted); }

/* توقيع واحد فقط يُدفَع لأقصى الطرف "الآخر" من الصفحة (اليسار في RTL) — بخلاف sign-grid-2 (عمود فارغ
   بعرض 50% ثابت يدفع المحتوى لمنتصف الصفحة فقط لا لحافتها الفعلية)، هذا يستخدم justify-content: flex-end
   على عنصر واحد بلا flex:1 فيتموضع طبيعيًا عند الحافة القصوى مباشرة بغضّ النظر عن عرض محتواه. */
.sign-grid-end { display: flex; justify-content: flex-end; margin-top: 24px; }
.sign-grid-end .sign-col { flex: 0 0 auto; font-size: 13px; min-width: 180px; }
