/* Shared mobile hardening for all public and authenticated layouts. */
html,body{max-width:100%;overflow-x:hidden}@supports(overflow:clip){html,body{overflow-x:clip}}img,svg,video,canvas{max-width:100%}input,select,textarea,button{max-width:100%}.main,.main__inner,.module-page,.settings-page,.module-card,.settings-card,.dashboard-card,.module-card__body,.settings-card__body{min-width:0}.table-scroll,.class-table-wrap,.report-table-wrap{max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-inline:contain}.data-table th,.data-table td{overflow-wrap:break-word}.module-page__header,.settings-page__header,.page-heading,.module-card__header,.settings-card__header,.filter-actions,.table-tools{min-width:0}.module-page__header>div,.settings-page__header>div,.page-heading>div{min-width:0}.module-page__header h1,.settings-page__header h1,.page-heading h1{overflow-wrap:anywhere}.btn,.pwa-action,.icon-button{touch-action:manipulation}
@media screen and (max-width:767px){body{font-size:14px}.main__inner{width:100%;padding:16px 12px calc(96px + env(safe-area-inset-bottom))}.module-page,.settings-page,.section-stack{gap:13px}.module-page__header,.settings-page__header,.page-heading{gap:11px}.module-page__header h1,.settings-page__header h1,.page-heading h1{font-size:clamp(21px,6vw,27px);line-height:1.15}.module-card,.settings-card,.dashboard-card{border-radius:12px}.module-card__header,.settings-card__header,.module-card__body,.settings-card__body{padding-left:15px;padding-right:15px}.module-form-grid,.settings-grid,.filter-bar,.split-layout,.meeting-layout,.portal-dashboard-grid{grid-template-columns:minmax(0,1fr)!important}.filter-actions,.module-card__footer,.settings-card__footer{width:100%}.filter-actions>.btn,.module-page__header>.btn,.settings-page__header>.btn{width:100%;justify-content:center}.module-input,.module-select,.form-input,.form-select,input,select,textarea{font-size:16px!important}.btn,button,a.icon-button{min-height:44px}.modal-shell{padding:10px}.modal-shell__dialog{width:100%;max-height:calc(100dvh - 20px);padding:18px;border-radius:14px}.dropdown-menu{max-width:calc(100vw - 24px)}.live-grid{grid-template-columns:minmax(0,1fr)!important}.live-card__actions{align-items:stretch;flex-direction:column}.live-card__actions .btn{width:100%}.auth-page{min-height:100dvh;padding:12px 12px 92px}.auth-shell{width:100%;margin:0}.form-panel{min-width:0;padding-left:24px!important;padding-right:24px!important}.auth-brand-logo{flex:0 0 auto}.portal-identity-panel{gap:12px}.portal-identity-panel__copy{overflow:hidden}.portal-identity-panel h1{overflow-wrap:anywhere}}
@media screen and (max-width:480px){.header-main{padding-inline:8px}.topbar-context strong{max-width:120px}.module-card__header,.settings-card__header,.module-card__body,.settings-card__body{padding-left:13px;padding-right:13px}.metric-grid,.kpi-grid{grid-template-columns:minmax(0,1fr)!important}.form-panel{padding:26px 20px!important}.auth-brand{transform:scale(.92);transform-origin:left center}.page-signature{padding-inline:12px;text-align:center}.fee-structure-table tr{grid-template-columns:minmax(0,1fr)!important}.fee-structure-table td:first-child{grid-column:auto}.student-profile-hero{display:grid;grid-template-columns:auto minmax(0,1fr)}.student-profile-page .student-status{grid-column:1/-1}.impersonation-banner{align-items:stretch;flex-direction:column}.impersonation-banner button{width:100%}}
.announcement-modal{position:fixed;z-index:10100;inset:0;display:grid;padding:18px;place-items:center}.announcement-modal[hidden]{display:none}.announcement-modal__backdrop{position:absolute;inset:0;background:rgba(30,15,21,.64);backdrop-filter:blur(4px)}.announcement-modal__card{position:relative;width:min(100%,520px);max-height:calc(100dvh - 36px);overflow-y:auto;padding:24px;border-radius:18px;background:#fff;box-shadow:0 24px 70px rgba(30,15,21,.3)}.announcement-modal__card>img{width:100%;max-height:280px;margin:-24px -24px 20px;width:calc(100% + 48px);object-fit:cover}.announcement-modal__card h2{margin:7px 0;font-size:24px}.announcement-modal__card p{margin:0 0 18px;line-height:1.65}.announcement-modal__close{position:absolute;z-index:2;top:10px;right:10px;width:40px;height:40px;border:0;border-radius:50%;background:rgba(255,255,255,.94);font-size:25px;cursor:pointer}.announcement-card__image{display:block;width:100%;max-height:300px;object-fit:cover}.announcement-card h2{margin:6px 0}.announcement-card p{line-height:1.65}@media screen and (max-width:600px){.announcement-modal{padding:10px}.announcement-modal__card{max-height:calc(100dvh - 20px);padding:20px}.announcement-modal__card>img{margin:-20px -20px 18px;width:calc(100% + 40px)}}
.live-class-picker__options{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px;max-height:220px;overflow:auto;padding:10px;border:1px solid var(--border);border-radius:12px;background:var(--surface-soft)}.live-class-picker__option{display:flex;align-items:center;gap:9px;min-height:44px;padding:9px 11px;border:1px solid transparent;border-radius:9px;background:#fff;cursor:pointer}.live-class-picker__option:has(input:checked){border-color:var(--primary);background:var(--primary-50);color:var(--primary);font-weight:700}.live-class-picker__option input{width:18px;height:18px;accent-color:var(--primary)}fieldset.module-field{min-width:0;border:0;padding:0}fieldset.module-field legend{margin-bottom:7px;font-size:12px;font-weight:700}
/* Attendance registers: on phones each row becomes a card so marking never needs sideways scrolling
   (a wide scroll box swallowed vertical swipes in the PWA). The save button stays reachable. */
@media screen and (max-width:767px){.table-scroll.attendance-scroll{overflow:visible;border:0;max-width:none}.data-table.attendance-table{min-width:0!important;width:100%;table-layout:auto}.attendance-table,.attendance-table tbody,.attendance-table tr,.attendance-table td{display:block;width:100%}.attendance-table thead{display:none}.data-table.attendance-table tr{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 10px;margin-bottom:10px;padding:12px;border:1px solid var(--border);border-radius:12px;background:#fff}.data-table.attendance-table td{padding:0;border:0;min-width:0;background:none}.attendance-table td::before{content:attr(data-label);display:block;margin-bottom:3px;font-size:10px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--text-secondary)}.data-table.attendance-table td.att-name{grid-column:1/-1;font-size:15px}.attendance-table td.att-name::before{display:none}.data-table.attendance-table td[data-label=Remarks],.data-table.attendance-table td[data-label=Status]{grid-column:1/-1}.attendance-table .module-input,.attendance-table .module-select{width:100%;min-height:44px;font-size:16px}.attendance-save{position:sticky;bottom:env(safe-area-inset-bottom);z-index:20;padding:10px 0;background:linear-gradient(transparent,var(--surface,#fff) 30%)}.attendance-save .btn{width:100%;justify-content:center;min-height:48px}}
.data-table th.is-sortable{cursor:pointer;user-select:none;white-space:nowrap}.data-table th.is-sortable:hover{color:var(--primary)}.sort-arrow{display:inline-block;width:8px;margin-left:6px;opacity:.35;vertical-align:middle}.sort-arrow::before{content:"↕";font-size:11px}[aria-sort=ascending] .sort-arrow,[aria-sort=descending] .sort-arrow{opacity:1;color:var(--primary)}[aria-sort=ascending] .sort-arrow::before{content:"↑"}[aria-sort=descending] .sort-arrow::before{content:"↓"}
.table-filter-bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:12px}.table-filter-bar input,.table-filter-bar select{min-height:40px;padding:0 12px;border:1px solid var(--border);border-radius:10px;background:var(--surface,#fff);font:inherit;font-size:14px}.table-filter-search{flex:1 1 220px}.table-filter-search input{width:100%}.table-filter-count{margin-left:auto;font-size:12px;color:var(--text-secondary);white-space:nowrap}
.data-table td{overflow-wrap:normal}.data-table td:has(>a[href^="tel:"]){white-space:nowrap}
@media screen and (max-width:767px){.table-filter-bar select{flex:1 1 calc(50% - 4px);min-width:0;font-size:16px}.table-filter-search input{font-size:16px}.table-filter-count{width:100%;margin:0}}
@media print{.table-filter-bar,.sort-arrow{display:none!important}}
.row-actions{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.row-actions form{margin:0}

/* Student / employee status: inactive and suspended badges, "since" lines, status forms. */
.student-status--suspended{background:#fdecee;color:#9b1c31}
.status-since{display:block;margin-top:3px;font-size:11px;color:var(--text-secondary)}
.person-status-tag{display:inline-block;margin-left:6px;padding:2px 7px;border-radius:999px;font-size:10.5px;font-weight:700;vertical-align:middle;white-space:nowrap}
.person-status-tag--inactive{background:#f1edef;color:#6d5b62}.person-status-tag--suspended{background:#fdecee;color:#9b1c31}
.status-apply{display:grid;grid-template-columns:1.4fr 1fr auto;gap:12px 14px;align-items:end;margin-bottom:16px;padding:14px;border:1px solid var(--border);border-radius:12px;background:#fbf8f9}
.status-apply small{font-size:11px;color:var(--text-secondary)}.status-apply__buttons{display:flex;flex-wrap:wrap;gap:8px}
.status-rules-note{display:flex;gap:10px;align-items:flex-start}.status-rules-note svg{width:20px;flex:none;color:var(--primary)}
.status-rules-table td small{display:block;margin-top:3px;font-size:11.5px;font-weight:400;color:var(--text-secondary)}.status-rules-table td{vertical-align:top}
.status-history{display:grid;gap:8px;margin:0;padding:0;list-style:none}.status-history li{padding:10px 12px;border:1px solid var(--border);border-radius:10px;font-size:13px}.status-history small{display:block;color:var(--text-secondary)}
@media screen and (max-width:900px){.status-apply{grid-template-columns:1fr}.status-apply__buttons .btn{flex:1 1 30%;justify-content:center}}

/* ---- UI/UX audit fixes (2026-10-04) ------------------------------------------------------ */
/* Scroll wrappers contain their absolutely positioned bits (e.g. the screen-reader text inside
   icon buttons). Without this, that text escaped the wrapper and made the whole phone page
   scroll sideways, stretching the fixed header with it (Delete Fees). */
.table-scroll,.class-table-wrap,.report-table-wrap,.fd-table-wrap,.ss-table-wrap{position:relative}
/* A wide table inside a card may never make the page itself wider than the screen. */
.module-page>*,.settings-page>*,.module-page form,.module-card__body,.settings-card__body{min-width:0}
@media screen and (max-width:767px){
  /* Form grids are one column on phones, so a field that spans 2-3 columns (e.g. an inline
     style="grid-column:span 2") must not create extra implicit columns that squeeze the real one
     to 0px wide (Fee Automation > Billing policy). */
  .module-form-grid>*{grid-column:1/-1!important}
  /* Finger-sized checkboxes and radio buttons (were 13px). Custom switches set their own size. */
  input[type=checkbox],input[type=radio]{width:20px;height:20px;min-width:20px;accent-color:var(--primary)}
  /* Page header actions: a compact row that wraps, instead of one full-width row per button. */
  body .module-page__header>.filter-actions{display:flex;flex-direction:row;flex-wrap:wrap;align-items:stretch;gap:8px;width:100%}
  body .module-page__header>.filter-actions>.btn,body .module-page__header>.filter-actions>form{flex:1 1 auto;width:auto;margin:0}
  body .module-page__header>.filter-actions>.btn,body .module-page__header>.filter-actions>form>.btn{min-height:42px;padding-inline:12px;justify-content:center;font-size:13px}
  body .module-page__header>.filter-actions>form>.btn{width:100%}
  /* Inactive & Suspended Rules: one card per rule on phones. */
  .status-rules-table{min-width:0!important}
  .status-rules-table,.status-rules-table tbody,.status-rules-table tr,.status-rules-table td{display:block;width:100%}
  .status-rules-table thead{display:none}
  .status-rules-table tr{display:grid;grid-template-columns:1fr 1fr;gap:8px 12px;padding:12px 14px;border-bottom:1px solid var(--border)}
  .status-rules-table td{padding:0!important;border:0!important}
  .status-rules-table td:first-child{grid-column:1/-1}
  .status-rules-table td[data-label]::before{content:attr(data-label);display:block;margin-bottom:4px;font-size:10px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:#8a7a80}
}

/* Notifications: errors and warnings look different from successes and can be dismissed. */
.toast{max-width:min(440px,calc(100vw - 24px));align-items:flex-start}
.toast>svg,.toast>i{flex:none;margin-top:1px}
.toast>span{flex:1;min-width:0;line-height:1.45}
.toast[data-type=error]{background:#8f1d2c}
.toast[data-type=warning]{background:#8a4b08}
.toast__close{flex:none;display:grid;place-items:center;width:26px;height:26px;margin:-3px -4px -3px 4px;border-radius:8px;background:rgba(255,255,255,.14);color:#fff;font-size:18px;line-height:1;cursor:pointer}
.toast__close:hover{background:rgba(255,255,255,.26)}
@media screen and (max-width:767px){.toast{bottom:calc(12px + env(safe-area-inset-bottom));z-index:120}}

/* Print layout chooser (js/print-options.js) */
.print-choice{position:fixed;inset:0;z-index:300;display:grid;place-items:center;padding:16px;background:rgba(25,10,16,.45)}
.print-choice__card{width:min(520px,100%);padding:20px;border-radius:16px;background:var(--surface,#fff);box-shadow:0 24px 60px rgba(0,0,0,.25)}
.print-choice__card h2{margin:0;font-size:18px;color:var(--text,#211a1d)}
.print-choice__card>p{margin:4px 0 14px;font-size:13px;color:var(--text-secondary,#6f6569)}
.print-choice__options{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.print-choice__options button{display:grid;justify-items:center;gap:6px;padding:14px 12px;border:1.5px solid #e3d1d8;border-radius:14px;background:#fff;text-align:center;cursor:pointer;font:inherit;color:inherit}
.print-choice__options button:hover,.print-choice__options button:focus-visible{border-color:var(--primary,#7a1632);outline:none;box-shadow:0 0 0 3px rgba(122,22,50,.12)}
.print-choice__options button.is-current{border-color:var(--primary,#7a1632);background:#fbf3f6}
.print-choice__options strong{font-size:15px;color:var(--primary-dark,#3b0b18)}
.print-choice__options small{font-size:12px;line-height:1.35;color:var(--text-secondary,#6f6569)}
.print-choice__page{display:grid;align-content:start;gap:4px;padding:7px;border:1.5px solid #cdb9c1;border-radius:4px;background:#fff}
.print-choice__page--p{width:44px;height:58px}.print-choice__page--l{width:66px;height:46px;gap:3px}
.print-choice__page i{display:block;height:5px;border-radius:2px;background:#e7dade}.print-choice__page--p i:first-child{height:9px;background:#d9c3cb}
.print-choice__page--l i{height:3px}
.print-choice__cancel{display:block;margin:14px auto 0;padding:8px 18px;border:0;border-radius:10px;background:none;color:var(--primary,#7a1632);font:inherit;font-weight:700;cursor:pointer}
@media screen and (max-width:480px){.print-choice__options{grid-template-columns:1fr}.print-choice__options button{grid-template-columns:auto 1fr;justify-items:start;text-align:left;column-gap:12px}.print-choice__page{grid-row:span 2}}
@media print{.print-choice{display:none!important}}

/* Visible focus and room to scroll fields clear of the fixed header/keyboard. */
input,select,textarea,[contenteditable=true]{scroll-margin-block:84px 24px}
input:focus-visible,select:focus-visible,textarea:focus-visible,button:focus-visible,a:focus-visible,summary:focus-visible{outline:3px solid var(--primary,#7a1632);outline-offset:3px}
.sidebar-overlay[hidden]{display:none!important}
@media(max-width:767px){.modal-shell__dialog{overflow-y:auto;overscroll-behavior:contain}}

@media screen and (max-width:1023px){.mobile-sidebar-close{display:grid!important}}

@media screen and (max-width:767px){.search,.search__field{position:static}.search{width:auto}.search input{position:absolute;top:calc(var(--header-height) + 8px);left:10px;right:10px;width:calc(100% - 20px);transition:border-color .16s ease,box-shadow .16s ease}.search.is-mobile-open input{visibility:visible;opacity:1;transform:none}}
