.frozen-col {
    position: sticky;
    left: 0;
    z-index: 20;
    background-color: #fff;
}
.frozen-header {
    position: sticky;
    left: 0;
    z-index: 30;
}
::-webkit-scrollbar { height: 8px; width: 8px; }
::-webkit-scrollbar-track { background: #f1f1f1; }
::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: #94a3b8; }

/* FIX: The app used "100vh" for the page height. On many phones that counts
   screen area hidden behind the system buttons/toolbar, so the bottom of the
   app (the last table row) fell into the hidden strip and could never be
   scrolled to. Using html/body height:100% follows only the VISIBLE area. */
html { height: 100%; }
body { height: 100% !important; }

/* FIX: Print styles so Clean View prints properly */
@media print {
    body { overflow: visible !important; height: auto !important; }
    #sidebar, header, #undoToast, .no-print { display: none !important; }
    #cleanViewModal { position: static !important; display: block !important; overflow: visible !important; height: auto !important; }
    #cleanTableWrapper { transform: none !important; box-shadow: none !important; border: none !important; width: 100% !important; max-width: 100% !important; }
    table { font-size: 9pt !important; }
    th, td { border: 1px solid #999 !important; padding: 4px !important; }
}
/* Students view dashboard: freeze the duty header row (sticky top) AND
   the student-name column (sticky left) at the same time. */
.sv-frozen-row { position: sticky; top: 0; z-index: 25; }
.sv-frozen-col { position: sticky; left: 0; z-index: 15; background-color: #fff; }
.sv-corner     { position: sticky; left: 0; top: 0; z-index: 35; }

/* Print only the Today view when printing from it */
@media print {
    body.printing-today { overflow: visible !important; height: auto !important; }
    body.printing-today > *:not(#todayViewModal) { display: none !important; }
    body.printing-today #todayViewModal { position: static !important; display: flex !important; overflow: visible !important; height: auto !important; background: #fff !important; }
}
/* Days borrowed from the previous / next month to complete a week (planner):
   a dotted vertical line marks where the current month starts and ends. */
td.pad-edge-r, th.pad-edge-r { border-right: 2px dotted #94a3b8; }
td.pad-edge-l, th.pad-edge-l { border-left: 2px dotted #94a3b8; }