/* سامانه مدرسه — Persian RTL, mobile-first, Vazirmatn self-hosted (Tahoma fallback) */
@font-face{font-family:'Vazirmatn';font-style:normal;font-weight:400;font-display:swap;src:url(fonts/vazirmatn-arabic-400.woff2) format('woff2');unicode-range:U+0600-06FF,U+0750-077F,U+0870-0891,U+0897-08E1,U+08E3-08FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC,U+102E0-102FB,U+10E60-10E7E,U+10EC2-10EC7,U+10EC9-10EEE,U+10EF0-10EFF,U+1EE00-1EE03,U+1EE05-1EE1F,U+1EE21-1EE22,U+1EE24,U+1EE27,U+1EE29-1EE32,U+1EE34-1EE37,U+1EE39,U+1EE3B,U+1EE42,U+1EE47,U+1EE49,U+1EE4B,U+1EE4D-1EE4F,U+1EE51-1EE52,U+1EE54,U+1EE57,U+1EE59,U+1EE5B,U+1EE5D,U+1EE5F,U+1EE61-1EE62,U+1EE64,U+1EE67-1EE6A,U+1EE6C-1EE72,U+1EE74-1EE77,U+1EE79-1EE7C,U+1EE7E,U+1EE80-1EE89,U+1EE8B-1EE9B,U+1EEA1-1EEA3,U+1EEA5-1EEA9,U+1EEAB-1EEBB,U+1EEF0-1EEF1}
@font-face{font-family:'Vazirmatn';font-style:normal;font-weight:700;font-display:swap;src:url(fonts/vazirmatn-arabic-700.woff2) format('woff2');unicode-range:U+0600-06FF,U+0750-077F,U+0870-0891,U+0897-08E1,U+08E3-08FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC,U+102E0-102FB,U+10E60-10E7E,U+10EC2-10EC7,U+10EC9-10EEE,U+10EF0-10EFF,U+1EE00-1EE03,U+1EE05-1EE1F,U+1EE21-1EE22,U+1EE24,U+1EE27,U+1EE29-1EE32,U+1EE34-1EE37,U+1EE39,U+1EE3B,U+1EE42,U+1EE47,U+1EE49,U+1EE4B,U+1EE4D-1EE4F,U+1EE51-1EE52,U+1EE54,U+1EE57,U+1EE59,U+1EE5B,U+1EE5D,U+1EE5F,U+1EE61-1EE62,U+1EE64,U+1EE67-1EE6A,U+1EE6C-1EE72,U+1EE74-1EE77,U+1EE79-1EE7C,U+1EE7E,U+1EE80-1EE89,U+1EE8B-1EE9B,U+1EEA1-1EEA3,U+1EEA5-1EEA9,U+1EEAB-1EEBB,U+1EEF0-1EEF1}
@font-face{font-family:'Vazirmatn';font-style:normal;font-weight:400;font-display:swap;src:url(fonts/vazirmatn-latin-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Vazirmatn';font-style:normal;font-weight:700;font-display:swap;src:url(fonts/vazirmatn-latin-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
:root{
  --navy:#1b2a4a; --navy2:#24365e; --orange:#e67e22; --green:#1e7d46;
  --red:#c0392b; --amber:#b7791f; --bg:#f2f4f7; --card:#fff; --line:#dfe3ea;
  --text:#1c2433; --muted:#667085; --radius:12px;
  --font:'Vazirmatn',Tahoma,'Segoe UI','IRANSans',sans-serif;
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;font-family:var(--font);background:var(--bg);color:var(--text);font-size:15px;line-height:1.8}
.hidden{display:none!important}
h1,h2,h3{margin:.2em 0 .6em;line-height:1.5}
h1{font-size:1.25rem} h2{font-size:1.1rem} h3{font-size:1rem}
p{margin:.3em 0}
a{color:var(--navy2)}
button{font-family:var(--font);cursor:pointer}
input,select,textarea{font-family:var(--font);font-size:15px;padding:9px 10px;border:1px solid var(--line);border-radius:8px;background:#fff;width:100%}
input[type=checkbox],input[type=radio]{width:auto}
label{display:block;font-weight:700;margin:10px 0 4px}
textarea{min-height:90px;resize:vertical}
.justify{text-align:justify;text-align-last:right}
.center{text-align:center}
.muted{color:var(--muted);font-size:.9em}
.small{font-size:.85em}
.num{font-variant-numeric:tabular-nums}

/* ---------- top bar (two compact rows; hides on scroll down) ---------- */
#topbar{background:var(--navy);color:#fff;position:sticky;top:0;z-index:50;transition:transform .25s ease}
#topbar.topbar-hidden{transform:translateY(-105%)}
.topbar-inner{display:flex;flex-direction:column;gap:2px;padding:6px 12px 8px}
.topbar-row{display:flex;align-items:center;gap:8px}
.topbar-row1{justify-content:space-between}
.topbar-row2{justify-content:flex-start}
.brand-title{font-weight:700;font-size:1.05rem;white-space:nowrap}
.role-badge{background:var(--orange);color:#fff;border-radius:20px;padding:1px 10px;font-size:.8rem}
#schoolSwitcher{width:auto;max-width:60%;background:#fff;color:#000}
/* ---------- hamburger menu panel ---------- */
.menu-panel{background:var(--navy);border-top:1px solid rgba(255,255,255,.15);padding:6px 10px 10px;display:flex;flex-direction:column;gap:2px}
.menu-item{display:flex;align-items:center;gap:8px;background:transparent;border:0;color:#dbe4f3;border-radius:8px;padding:9px 12px;font-size:.95rem;text-align:start;cursor:pointer;width:100%}
.menu-item:hover{background:rgba(255,255,255,.1);color:#fff}
.menu-item.active{background:#fff;color:var(--navy);font-weight:700}
.menu-item.danger{color:#ffb4ab}
.menu-item.danger:hover{background:rgba(255,255,255,.1);color:#ffd7d2}
.menu-sep{height:1px;background:rgba(255,255,255,.18);margin:6px 4px}
/* ---------- inline SVG icons ---------- */
.ico{vertical-align:-3px;flex-shrink:0}
.btn-icon{display:inline-flex;align-items:center;justify-content:center}
.btn-icon .ico{vertical-align:0}
.menu-item .ico{vertical-align:0}
/* ---------- icon guide modal ---------- */
.icon-guide{display:grid;grid-template-columns:repeat(2,1fr);gap:6px 16px;margin-top:10px}
.icon-guide-row{display:flex;align-items:center;gap:10px;padding:6px 4px;border-bottom:1px solid var(--line)}
.icon-guide-ico{display:inline-flex;color:var(--navy)}
@media(max-width:640px){.icon-guide{grid-template-columns:1fr}}

/* ---------- layout ---------- */
.app{max-width:980px;margin:0 auto;padding:14px 12px 60px}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:14px;margin-bottom:14px}
.card h2{margin-top:0}
.grid{display:grid;gap:12px}
.grid.cols2{grid-template-columns:repeat(2,1fr)}
.grid.cols3{grid-template-columns:repeat(3,1fr)}
.grid.cols4{grid-template-columns:repeat(4,1fr)}
@media(max-width:640px){.grid.cols2,.grid.cols3,.grid.cols4{grid-template-columns:repeat(2,1fr)}}
.stat{background:#f8fafc;border:1px solid var(--line);border-radius:10px;padding:10px;text-align:center}
.stat .v{font-size:1.4rem;font-weight:700;color:var(--navy)}
.stat .k{font-size:.85rem;color:var(--muted)}
.stat.ok .v{color:var(--green)} .stat.warn .v{color:var(--amber)} .stat.bad .v{color:var(--red)}

/* ---------- buttons / chips ---------- */
.btn{display:inline-block;border:1px solid var(--navy);background:var(--navy);color:#fff;border-radius:8px;padding:8px 16px;font-size:15px;text-decoration:none}
.btn:hover{background:var(--navy2)}
.btn.secondary{background:#fff;color:var(--navy)}
.btn.danger{background:var(--red);border-color:var(--red)}
.btn.warn{background:#fff;color:var(--amber);border-color:var(--amber)}
.btn.success{background:var(--green);border-color:var(--green)}
.btn.ghost{background:transparent;border-color:rgba(255,255,255,.6);color:#fff;padding:5px 10px}
.btn-sm{padding:4px 10px;font-size:.85rem}
.btn-icon{padding:5px 9px;font-size:1.05rem;line-height:1.2;min-width:36px;text-align:center}
@media(max-width:640px){table th,table td{padding:6px 5px;font-size:.92rem}.btn-icon{min-width:32px;padding:4px 7px}}
.btn:disabled{opacity:.5;cursor:not-allowed}
.btn-block{width:100%;text-align:center}
.chip{display:inline-block;border:1px solid var(--line);background:#fff;border-radius:20px;padding:5px 13px;margin:3px;cursor:pointer}
.chip.active{background:var(--navy);color:#fff;border-color:var(--navy);font-weight:700}
.chip:disabled{opacity:.45;cursor:not-allowed}
.badge{display:inline-block;border-radius:12px;padding:1px 9px;font-size:.8rem;background:#eef1f6;color:#333}
.badge.green{background:#d9f0e2;color:#14532d}
.badge.red{background:#fde3e0;color:#7a1f16}
.badge.amber{background:#fdf0d3;color:#7a5410}
.badge.blue{background:#dde8fb;color:#1b2a4a}
.badge.grey{background:#eceef2;color:#555}

/* ---------- tables ---------- */
.table-wrap{overflow-x:auto}
table{width:100%;border-collapse:collapse;background:#fff}
th,td{border:1px solid var(--line);padding:7px 6px;text-align:center;vertical-align:middle}
th{background:#eef1f6;font-size:.9rem}
td.name,td.justify{text-align:right}
tr.clickable{cursor:pointer}
tr.clickable:hover{background:#f6f8fc}

/* ---------- login ---------- */
.login-wrap{max-width:460px;margin:24px auto}
.login-wrap h1{text-align:center}
.tabs{display:flex;border-bottom:2px solid var(--line);margin-bottom:14px}
.tabs button{flex:1;background:none;border:none;padding:10px 4px;font-size:15px;color:var(--muted);border-bottom:3px solid transparent;margin-bottom:-2px}
.tabs button.active{color:var(--navy);font-weight:700;border-bottom-color:var(--orange)}
.alert{border-radius:8px;padding:10px 12px;margin:10px 0}
.alert.error{background:#fdeceb;color:#7a1f16;border:1px solid #f5c6c0}
.alert.warn{background:#fdf6e3;color:#7a5410;border:1px solid #f0dcae}
.alert.ok{background:#e6f4ea;color:#14532d;border:1px solid #bfe3c9}
.alert.info{background:#e8eefb;color:#1b2a4a;border:1px solid #c3d2ef}
.hint{font-size:.85rem;color:var(--muted)}

/* ---------- attendance / grades ---------- */
.status-row{display:flex;gap:6px;flex-wrap:wrap;justify-content:center}
.status-row .chip{padding:4px 10px;margin:2px}
.roster-name{text-align:right;font-weight:700}
input.grade-input{width:76px;text-align:center;padding:6px}
.kv{display:flex;justify-content:space-between;gap:10px;padding:5px 0;border-bottom:1px dashed var(--line)}
.kv:last-child{border-bottom:none}
.kv b{font-weight:700}
.list-item{display:flex;justify-content:space-between;gap:10px;align-items:center;padding:9px 2px;border-bottom:1px solid var(--line)}
.list-item:last-child{border-bottom:none}
.linklike{background:none;border:none;color:var(--navy2);text-decoration:underline;padding:0;font-size:inherit}
.matrix td{cursor:pointer}
.matrix td.sel{background:#dde8fb}
.matrix td.unrec{color:var(--muted)}
.modal-back{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;align-items:flex-end;justify-content:center;z-index:100}
.modal{background:#fff;border-radius:14px 14px 0 0;width:100%;max-width:640px;max-height:88vh;overflow:auto;padding:16px}
@media(min-width:700px){.modal-back{align-items:center}.modal{border-radius:14px}}
#toastRoot{position:fixed;bottom:16px;left:50%;transform:translateX(-50%);z-index:200;display:flex;flex-direction:column;gap:8px;align-items:center}
.toast{background:#1c2433;color:#fff;border-radius:8px;padding:9px 16px;box-shadow:0 4px 14px rgba(0,0,0,.3)}
.toast.err{background:var(--red)}
.photo-grid{display:flex;gap:8px;flex-wrap:wrap}
.photo-grid figure{margin:0;width:104px}
.photo-grid img{width:104px;height:104px;object-fit:cover;border-radius:8px;border:1px solid var(--line)}
.photo-grid figcaption{font-size:.75rem;text-align:center}
.progress{height:8px;background:#e8ecf2;border-radius:6px;overflow:hidden}
.progress i{display:block;height:100%;background:var(--green)}
.section-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px}
.section-tabs button{border:1px solid var(--line);background:#fff;border-radius:20px;padding:6px 14px}
.section-tabs button.active{background:var(--navy);color:#fff;border-color:var(--navy)}
.empty{color:var(--muted);text-align:center;padding:18px 6px}
.toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:end;margin-bottom:12px}
.toolbar>*{flex:1;min-width:140px}
.toolbar .btn{flex:0 0 auto}
/* Compact input inside a toolbar (patch n): the "new grade / new class"
   fields no longer stretch full-width. */
.toolbar .field-narrow{flex:0 1 280px;min-width:180px}
/* Collapsible grade block (patch o): keeps the structure tab compact. */
.grade-block{border:1px solid var(--line,#e3e6ea);border-radius:10px;padding:8px 10px;margin-bottom:10px}
/* Inherited timetable cell (patch ae): a class cell that comes from the
   grade default — dashed border; changing it makes a class override. */
.ttCell.inherited{border-style:dashed}
.grade-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.grade-head .chev{display:inline-flex;transition:transform .15s}
.grade-head .chev.open{transform:rotate(180deg)}
.grade-body{margin-top:8px}
/* Announcement bar (patch r): full-width bar at the top of the panel;
   orange for info, red for urgent. Long text scrolls left-to-right. */
.announce{overflow:hidden;white-space:nowrap;border:1px solid;padding:10px 0;margin-bottom:12px;text-align:center}
.announce.info{background:#fff7e6;border-color:#f0b429;color:#7a5200}
.announce.urgent{background:#fdecea;border-color:#e57373;color:#8f1d1d}
.announce-track{display:inline-block;white-space:nowrap;padding:0 16px;direction:rtl;unicode-bidi:plaintext}
.announce.marquee{direction:ltr;text-align:left}
.announce.marquee .announce-track{animation:announce-scroll linear infinite}
@keyframes announce-scroll{from{transform:translateX(-100%)}to{transform:translateX(100%)}}
@media (prefers-reduced-motion: reduce){.announce.marquee .announce-track{animation:none}}
#announceRoot .announce{margin-bottom:0}
/* Parent section navigation (patch t): visible chips that scroll to a section. */
.pv-nav{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 12px}
.pv-today{border-top:1px solid var(--line,#e3e6ea);margin-top:12px;padding-top:10px}
.pv-today h3{margin:0 0 6px}
.pv-today p{margin:4px 0}
@media print{ #topbar,#announceRoot,#toastRoot,.no-print{display:none!important} body{background:#fff} .app{max-width:none;padding:0} }

/* chat (patch ao): parent <-> manager threads */
.chat-thread { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; }
.chat-msg { max-width: 85%; padding: 8px 12px; border-radius: 12px; background: #eef2ff; align-self: flex-start; }
.chat-msg.mine { background: #dcfce7; align-self: flex-end; }
.chat-who { font-size: .75rem; color: #64748b; margin-bottom: 4px; }
.chat-body { white-space: pre-wrap; text-align: justify; }
.chat-photo { display: block; max-width: 230px; width: 100%; min-height: 40px; margin-top: 6px; border-radius: 8px; background: #e2e8f0; }

/* parent view tabs (patch aq): one section at a time + dashboard actions */
.pv-tabs { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 12px; }
.pv-tab { border: 1px solid var(--line); background: var(--card); color: var(--text); border-radius: 999px; padding: 6px 14px; font: inherit; font-size: .92rem; cursor: pointer; }
.pv-tab.active { background: var(--navy); border-color: var(--navy); color: #fff; font-weight: 700; }
.pv-section[hidden] { display: none !important; }
.pv-action { display: flex; align-items: center; justify-content: space-between; gap: 10px; border: 1px solid #f0c36d; background: #fff8e6; border-radius: 10px; padding: 10px 12px; margin-top: 10px; }
.pv-action[hidden] { display: none !important; }

/* today's status, per-bell visual cards (patch ar) */
.today-summary { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 2px; }
.ts-chip { border-radius: 999px; padding: 2px 12px; font-size: .85rem; font-weight: 700; }
.ts-chip.green { background: #dcfce7; color: #166534; }
.ts-chip.amber { background: #fef3c7; color: #92400e; }
.ts-chip.red { background: #fee2e2; color: #991b1b; }
.ts-chip.grey { background: #e5e7eb; color: #374151; }
.today-bells { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 8px; }
.today-bell { border: 1.5px solid var(--line); border-radius: 12px; padding: 10px 8px; text-align: center; background: #fafbfc; }
.today-bell .tb-bell { font-size: .8rem; color: var(--muted); }
.today-bell .tb-subject { font-weight: 800; font-size: 1.02rem; margin: 3px 0 8px; }
.today-bell .tb-note { font-size: .78rem; color: var(--muted); }
.today-bell.st-present { border-color: #4ade80; background: #f0fdf4; }
.today-bell.st-late { border-color: #fbbf24; background: #fffbeb; }
.today-bell.st-absent { border-color: #f87171; background: #fef2f2; }
.today-bell.st-excused { border-color: #a5b4fc; background: #eef2ff; }
.pv-today-off { font-weight: 700; color: var(--muted); }
@media (max-width: 520px) { .today-bells { gap: 6px; } .today-bell { padding: 8px 4px; } .today-bell .tb-subject { font-size: .92rem; } }

/* manager dashboard unread-messages alert (patch as) */
.pm-alert { display: flex; align-items: center; justify-content: space-between; gap: 12px; border: 1.5px solid var(--orange); background: #fdf3e7; }
.pm-alert-main { display: flex; flex-direction: column; gap: 2px; }
.pm-alert-actions { display: flex; gap: 8px; flex: 0 0 auto; }
