/* Shared layout rules: all modules use the same spacing, controls and grid behavior. */
:root{--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-6:24px;--space-8:32px;--ui-gap:var(--space-6);--ui-pad:var(--space-6);--ui-radius:12px;--ui-border:#dfe5dc;--ui-muted:#f6f8f2;--ui-focus:#356f50}
.workspace{width:100%;max-width:1536px;padding:var(--space-6) var(--space-8) var(--space-8);min-width:0}
.workspace>*{min-width:0}
.workspace>.panel:first-child,.workspace>form:first-child{margin-top:0}
.workspace .panel{border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 2px 6px #203d3003;min-width:0}
.workspace .panel-head{padding:var(--space-6) var(--ui-pad);align-items:center;flex-wrap:wrap;gap:12px;border-bottom:1px solid #edf0e8}
.workspace .panel-head>div{min-width:0;flex:1}
.workspace .panel-head h2{margin-top:0;overflow-wrap:anywhere}
.workspace :is(.panel.p-6,.panel.p-5){padding:var(--ui-pad)}
.workspace :is(.panel.mt-5,.panel.mt-6,.panel.mt-7,.dash-section){margin-top:var(--ui-gap)}
.workspace :is(.grade-settings-grid,.uh-two-columns,.attendance-bottom-grid){gap:var(--ui-gap);align-items:start}
.workspace :is(.uh-form-grid,.followup-fields,.journal-fields,.export-filters,.student-field-grid){gap:var(--space-4);align-items:end}
.workspace :is(.uh-form-grid,.followup-fields,.journal-fields,.export-filters,.student-field-grid)>*{min-width:0}
.workspace :is(.uh-toolbar,.followup-toolbar,.journal-toolbar,.attendance-inline,.attendance-toolbar,.grade-toolbar){gap:16px;min-width:0}
.workspace form:is(.uh-toolbar,.followup-toolbar,.journal-toolbar,.module-filter){display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));align-items:end;gap:var(--space-4)}
.workspace form:is(.uh-toolbar,.followup-toolbar,.journal-toolbar,.module-filter)>.button{justify-self:start}
.workspace form:is(.uh-toolbar,.followup-toolbar,.journal-toolbar,.module-filter)>label{min-width:0}
.workspace .attendance-quick-picker{gap:var(--space-4)}
.workspace label:not(.check){line-height:1.6}
.workspace input:not([type=checkbox]):not([type=hidden]),.workspace select,.workspace textarea{border:1px solid #d3ddd1;border-radius:8px;background:#fff;color:#273f30;padding:10px 12px;box-sizing:border-box;max-width:100%;min-height:44px;transition:border-color .15s,box-shadow .15s}
.workspace textarea{display:block;width:100%;margin-top:var(--space-2);resize:vertical;line-height:1.7;min-height:84px}
.workspace :is(input,select,textarea):focus{outline:2px solid #63916b;outline-offset:1px;border-color:#63916b;box-shadow:0 0 0 3px #e9f2e5}
.workspace :is(input,textarea)::placeholder{color:#879283;opacity:1}
.workspace :is(input,select,textarea):disabled{background:#f1f4ed;color:#7a8574;cursor:not-allowed}
.workspace input[type=checkbox]{width:18px;height:18px;accent-color:#225340;flex-shrink:0;vertical-align:middle}
.workspace .check{gap:var(--space-2);line-height:1.6}
.workspace :is(.button,.secondary,.danger){min-height:42px;display:inline-flex;justify-content:center;align-items:center;gap:10px;padding:10px 16px;line-height:1.5;border-radius:8px;vertical-align:middle;text-align:center;white-space:normal}
.workspace .button{border:1px solid transparent}
.workspace .secondary{border-color:#d4dfce}
.workspace .secondary:hover{background:#f2f6ec;border-color:#9db68d}
.workspace :is(button:disabled,.button[aria-disabled=true]){opacity:.55;cursor:not-allowed}
.workspace :is(.button,.secondary,.danger):focus-visible{outline:3px solid #b67720;outline-offset:3px}
.workspace :is(.followup-actions,.journal-actions,.export-filter-actions,.student-actions,.grade-save-actions){gap:12px;flex-wrap:wrap}
.workspace :is(.followup-actions,.journal-actions)>label{flex:1 1 180px;max-width:320px}
.workspace :is(.grade-save-actions,.followup-save,.module-save-bar){display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-3) var(--space-4);padding:var(--space-4) var(--ui-pad);border-top:1px solid var(--ui-border);background:#f8faf5;border-radius:0 0 var(--ui-radius) var(--ui-radius)}
.workspace :is(.grade-save-actions,.followup-save,.module-save-bar)>.hint{flex:1 1 260px;margin:0;max-width:750px}
.workspace :is([data-attendance-status],[data-grade-save-status],[data-uh-save-status]){padding:6px 10px;border:1px solid #dce7d3;background:#f3f7ed;border-radius:6px;max-width:100%;overflow-wrap:anywhere}
.workspace .grade-save-failed{background:#fff1eb;border-color:#e9c2b5;color:#943e29}
.workspace :is(.notice,.error){line-height:1.75;padding:var(--space-4);margin-bottom:var(--space-6);overflow-wrap:anywhere}
.workspace details.panel>summary{padding:var(--space-4) var(--ui-pad);line-height:1.6}
.workspace details.panel[open]>summary{border-bottom:1px solid #e7ecdf;background:#f8faf4}
.workspace :is(.attendance-heading,.grade-section-title,.uh-heading){font-weight:600}
.workspace :is(.panel,.empty) h3{line-height:1.5}
.workspace .empty{padding:var(--space-8) var(--ui-pad)}
.workspace .hint,.workspace .subtext{max-width:100%;overflow-wrap:anywhere}
.workspace [id]{scroll-margin-top:calc(var(--header-height,86px) + 20px)}
.workspace .footer{margin-top:var(--space-8);padding-top:var(--space-6)}
/* Search and pagination align with the panel content. */
.workspace div.dt-container div.dt-layout-row:not(.dt-layout-table){padding:16px var(--ui-pad);gap:16px}
.workspace div.dt-container .dt-search{min-width:0;flex-wrap:wrap}
.workspace div.dt-container .dt-search input{width:250px;max-width:100%;min-height:40px;margin:0}
.workspace div.dt-container .dt-length select{width:auto;min-height:40px;margin:0}
.workspace div.dt-container .dt-paging .dt-paging-button{min-height:36px;min-width:36px;line-height:1.5}
.workspace table.dataTable tbody>tr>td{padding:var(--space-4);vertical-align:middle}
.workspace table.dataTable thead>tr>th{padding:var(--space-4);vertical-align:middle;line-height:1.6}
.workspace table :is(input,select,textarea){margin-top:0}
.workspace table tbody tr:focus-within>td{background-color:#f0f6e8}
.workspace .data-grid-scroll{max-height:min(62dvh,680px);overflow:auto;overscroll-behavior:contain;scroll-padding:80px 12px 12px;isolation:isolate}
.workspace .data-grid-scroll table{border-collapse:separate;border-spacing:0}
.workspace .data-grid-scroll thead th{position:sticky;top:0;z-index:3;background:#f2f5ec;border-bottom:1px solid #dce4d5}
.workspace table:is([data-grade-grid],[data-uh-grid],[data-attendance-grid]) :is(th,td):nth-child(1){width:120px;min-width:120px;max-width:120px;position:sticky;left:0;z-index:1;background:#fff;white-space:nowrap}
.workspace table:is([data-grade-grid],[data-uh-grid],[data-attendance-grid]) :is(th,td):nth-child(2){width:210px;min-width:210px;max-width:210px;position:sticky;left:120px;z-index:1;background:#fff;border-right:1px solid #dce4d5;overflow-wrap:anywhere}
.workspace table:is([data-grade-grid],[data-uh-grid],[data-attendance-grid]) thead th:nth-child(-n+2){z-index:4;background:#f2f5ec}
.workspace table:is([data-grade-grid],[data-uh-grid]) td{padding:10px 12px}
.workspace :is(input.grade-score,input.uh-score){min-height:44px;font-variant-numeric:tabular-nums;padding:9px;text-align:center}
.workspace :is(input.grade-score,input.uh-score):placeholder-shown{background:#fff9e9;border-color:#e4d4a4}
.workspace :is(input.grade-score,input.uh-score)[aria-invalid=true]{background:#fff0e9;border:2px solid #b54329}
.workspace .attendance-unrecorded td{background:#fffaf0}
.workspace .attendance-unrecorded td:nth-child(-n+2){background:#fffaf0}
.grid-scroll-hint{padding:10px var(--ui-pad);margin:0;border-top:1px solid #e9eee2;background:#fafbf7;color:#71806b;font-size:.75rem;line-height:1.7}
@media(max-width:1100px){.workspace{padding:24px}.workspace .grade-toolbar{align-items:flex-start;flex-wrap:wrap}.workspace .grade-toolbar>div{min-width:0}.workspace .grade-toolbar>form{flex:1 1 220px}.workspace .uh-stats{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:767px){
 :root{--ui-pad:var(--space-4);--ui-gap:var(--space-4)}
 .workspace{padding:var(--space-4) var(--space-4) var(--space-6)}
 .workspace :is(.panel-head,.grade-progress,.attendance-toolbar,.student-toolbar){align-items:flex-start;gap:12px}
 .workspace .panel-head>div{flex-basis:100%}
 .workspace :is(.grade-settings-grid,.uh-two-columns,.attendance-bottom-grid,.student-field-grid,.followup-fields,.journal-fields,.export-filters){grid-template-columns:minmax(0,1fr)}
 .workspace .uh-stats{grid-template-columns:minmax(0,1fr)}
 .workspace .attendance-quick-picker{grid-template-columns:minmax(0,1fr)}
 .workspace form:is(.uh-toolbar,.followup-toolbar,.journal-toolbar,.module-filter){grid-template-columns:minmax(0,1fr)}
 .workspace :is(.followup-actions,.journal-actions){width:100%}
 .workspace :is(.followup-actions,.journal-actions)>label{max-width:none}
 .workspace :is(.grade-save-actions,.followup-save,.module-save-bar)>.button{width:100%}
 .workspace .data-grid-scroll{max-height:60dvh}
 .workspace table:is([data-grade-grid],[data-uh-grid],[data-attendance-grid]) :is(th,td):nth-child(1){position:static;width:105px;min-width:105px;max-width:105px}
 .workspace table:is([data-grade-grid],[data-uh-grid],[data-attendance-grid]) :is(th,td):nth-child(2){left:0;width:160px;min-width:160px;max-width:160px}
 .workspace table:is([data-grade-grid],[data-uh-grid],[data-attendance-grid]) thead th:first-child{position:sticky;z-index:3}
 .workspace div.dt-container .dt-search{display:block;width:100%}
 .workspace div.dt-container .dt-search input{width:100%;margin-top:6px}
 .workspace div.dt-container .dt-length{justify-content:space-between}
 .workspace input:not([type=checkbox]):not([type=hidden]),.workspace select,.workspace textarea{font-size:1rem}
 .workspace .footer{gap:8px}
}
@media(prefers-reduced-motion:reduce){.workspace :is(input,select,textarea){transition:none}}
@media(min-width:768px) and (max-width:1200px){.workspace .attendance-quick-picker{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* One vertical rhythm for sibling sections; avoid combined mb-* and mt-* gaps. */
.workspace>:is(section,form,details,div){margin-top:0;margin-bottom:0}
.workspace>:is(section,form,details,div)~:is(section,form,details,div){margin-top:var(--ui-gap)}
.workspace .panel:is(.p-5,.p-6,.p-8),.workspace .panel :is(.p-5,.p-6,.p-8){padding:var(--ui-pad)}
.workspace .panel :is(.px-5,.px-6,.px-8){padding-left:var(--ui-pad);padding-right:var(--ui-pad)}
.workspace :is(.uh-form-grid,.followup-fields,.journal-fields,.export-filters,.student-field-grid,.attendance-quick-picker){gap:var(--space-4)}
.workspace .panel form:is(.space-y-4,.space-y-5)>:not([hidden]):not(input[type=hidden])~:not([hidden]):not(input[type=hidden]){margin-top:var(--space-4);margin-bottom:0}
.workspace label>input:not([type=checkbox]):not([type=hidden]),.workspace label>select,.workspace label>textarea{margin-top:var(--space-2)}
.workspace table label.sr-only+input,.workspace table label.sr-only+select{margin-top:0}
.workspace :is(.hint,.subtext):is(.mt-2,.mt-3){margin-top:var(--space-2)}
.workspace :is(.hint,.subtext):is(.mt-4,.mt-5){margin-top:var(--space-4)}
.workspace :is(.followup-actions,.journal-actions,.export-filter-actions,.student-actions,.grade-save-actions){gap:var(--space-3)}
.workspace :is(.dash-stats,.dash-columns,.dash-side-stack){gap:var(--space-4)}
.workspace :is(.dash-welcome,.dash-stat,.dash-guide){padding:var(--ui-pad)}
.workspace :is(.followup-summary,.journal-counts,.uh-stats){gap:var(--space-4)}
.workspace :is(.student-form-section,.student-save-bar){padding:var(--ui-pad)}
@media(max-width:767px){.workspace .panel-head{padding:var(--space-4) var(--ui-pad)}}

/* Grade filters: two proportional fields and a button-sized action column. */
.workspace form.module-filter{grid-template-columns:minmax(200px,1fr) minmax(260px,1.7fr) auto;column-gap:var(--space-6);row-gap:var(--space-4)}
.workspace form.module-filter>label{display:flex;flex-direction:column;gap:var(--space-2)}
.workspace form.module-filter>label>select{margin-top:0;min-height:46px}
.workspace form.module-filter>.button{min-height:46px;justify-self:stretch;white-space:nowrap;margin:0}
@media(max-width:1000px){.workspace form.module-filter{grid-template-columns:repeat(2,minmax(0,1fr))}.workspace form.module-filter>.button{grid-column:1/-1;justify-self:end}}
@media(max-width:767px){.workspace form.module-filter{grid-template-columns:minmax(0,1fr);gap:var(--space-4)}.workspace form.module-filter>.button{justify-self:stretch;width:100%}}

/* A local chevron gives all single-choice selects the same right inset. */
body select:not([multiple]):not([size]),body select[size="1"]{
 appearance:none;
 -webkit-appearance:none;
 background-image:url('/assets/select-chevron.svg');
 background-repeat:no-repeat;
 background-position:right 14px center;
 background-size:18px 18px;
 padding-right:44px!important;
}
@media(forced-colors:active){body select:not([multiple]):not([size]),body select[size="1"]{appearance:auto;-webkit-appearance:auto;background-image:none}}
