:root{--portal-accent:var(--accent);--portal-soft:var(--accent-soft)}
body.portal-page{min-height:100vh;background:linear-gradient(145deg,var(--bg) 0%,var(--surface-2) 100%)}
.portal-page [hidden]{display:none!important}
.portal-topbar{position:sticky;top:0;z-index:200;background:var(--topbar-bg);border-bottom:1px solid var(--line);box-shadow:0 5px 20px rgba(15,23,42,.05)}
.portal-topbar-inner{max-width:1120px;margin:0 auto;padding:12px 20px;display:flex;align-items:center;gap:14px}.portal-logo{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--ink);min-width:0}.portal-logo img{width:42px;height:42px;object-fit:contain;border-radius:10px}.portal-logo-copy{min-width:0}.portal-logo-copy b,.portal-logo-copy span{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.portal-logo-copy span{color:var(--ink-3);font-size:.72rem;margin-top:1px}.portal-nav{margin-left:auto;display:flex;gap:6px;align-items:center}.portal-nav button,.portal-nav-link{border:0;background:transparent;color:var(--ink-2);font:inherit;font-weight:700;padding:9px 12px;border-radius:10px;cursor:pointer;text-decoration:none}.portal-nav button.active,.portal-nav button:hover,.portal-nav-link:hover{color:var(--accent);background:var(--accent-soft)}
.portal-shell{max-width:1120px;margin:0 auto;padding:42px 20px 90px}.portal-hero{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:24px;align-items:center;padding:28px;margin-bottom:22px;background:linear-gradient(135deg,var(--surface) 0%,var(--accent-soft) 100%);border:1px solid var(--line-2);border-radius:22px;box-shadow:var(--shadow)}.portal-kicker{text-transform:uppercase;letter-spacing:.13em;color:var(--accent);font-size:.72rem;font-weight:900}.portal-hero h1{margin:7px 0 8px}.portal-hero p{margin:0;color:var(--ink-2);max-width:680px}.portal-identity{display:flex;align-items:center;gap:10px;color:var(--ink-2);font-size:.8rem}.portal-identity strong{color:var(--ink)}
.portal-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:22px}.portal-stat{padding:16px 18px}.portal-stat b{display:block;font-size:1.45rem;color:var(--accent)}.portal-stat span{font-size:.78rem;color:var(--ink-3)}
.portal-section-head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:28px 0 13px}.portal-section-head h2{margin:0;font-size:1.2rem}.portal-exams{display:grid;gap:12px}.portal-exam{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px;align-items:center;padding:18px}.portal-exam h3{margin:0 0 7px;font-size:1rem}.portal-meta{display:flex;flex-wrap:wrap;gap:7px}.portal-chip{padding:4px 8px;border-radius:99px;background:var(--surface-2);border:1px solid var(--line);color:var(--ink-2);font-size:.72rem;font-weight:700}.portal-chip.open{background:var(--ok-soft);color:var(--ok);border-color:color-mix(in srgb,var(--ok) 35%,transparent)}.portal-chip.upcoming{background:var(--warn-soft);color:var(--warn)}.portal-empty{padding:34px;text-align:center;color:var(--ink-3)}
.portal-panel[hidden]{display:none}.portal-table-wrap{overflow:auto;border:1px solid var(--line);border-radius:14px;background:var(--surface)}.portal-table{width:100%;border-collapse:collapse;min-width:650px}.portal-table th,.portal-table td{text-align:left;padding:11px 13px;border-bottom:1px solid var(--line);font-size:.8rem}.portal-table th{color:var(--ink-3);font-size:.72rem;text-transform:uppercase;letter-spacing:.04em}.portal-table tr:last-child td{border-bottom:0}
.portal-class-block{margin:0 0 24px}.portal-class-heading{display:flex;justify-content:space-between;align-items:flex-end;gap:18px;padding:4px 2px 12px}.portal-class-heading h3{margin:8px 0 3px;font-size:1.25rem}.portal-class-heading p{margin:0;color:var(--ink-3);font-size:.82rem}.portal-class-count{color:var(--ink-3);font-size:.75rem;font-weight:800}.portal-lesson-list{display:grid;gap:9px}.portal-lesson{overflow:hidden}.portal-lesson summary{list-style:none;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:12px;padding:15px 17px;cursor:pointer}.portal-lesson summary::-webkit-details-marker{display:none}.portal-lesson summary b,.portal-lesson summary small{display:block}.portal-lesson summary small{margin-top:3px;color:var(--ink-3);font-size:.75rem;font-weight:500}.portal-lesson-no{width:30px;height:30px;border-radius:10px;display:grid;place-items:center;background:var(--accent-soft);color:var(--accent);font-weight:900}.portal-lesson[open] summary{border-bottom:1px solid var(--line)}.portal-lesson-content{padding:18px;line-height:1.7;color:var(--ink-2)}.portal-lesson-content .katex-display{overflow-x:auto;overflow-y:hidden}.portal-lesson-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px;padding-top:13px;border-top:1px solid var(--line)}.portal-empty-compact{padding:20px}
.portal-manage-layout{display:grid;grid-template-columns:270px minmax(0,1fr);gap:16px;align-items:start}.portal-class-sidebar{padding:14px;position:sticky;top:84px}.portal-class-sidebar-head{display:flex;justify-content:space-between;align-items:center;gap:9px;padding:2px 2px 10px}.portal-class-sidebar-head b,.portal-class-sidebar-head small{display:block}.portal-class-sidebar-head small{font-size:.7rem;color:var(--ink-3);margin-top:2px}.portal-class-select-list{display:grid;gap:6px}.portal-class-select{width:100%;border:1px solid transparent;background:transparent;color:var(--ink);border-radius:11px;padding:11px;display:flex;justify-content:space-between;align-items:center;gap:8px;text-align:left;cursor:pointer}.portal-class-select:hover{background:var(--surface-2)}.portal-class-select.active{background:var(--accent-soft);border-color:color-mix(in srgb,var(--accent) 28%,transparent);color:var(--accent)}.portal-class-select b,.portal-class-select small{display:block}.portal-class-select small{font-size:.68rem;color:var(--ink-3);margin-top:3px}.portal-manage-main{display:grid;gap:14px;min-width:0}.portal-class-overview{padding:18px;display:flex;justify-content:space-between;align-items:center;gap:16px;background:linear-gradient(135deg,var(--surface),var(--accent-soft))}.portal-class-overview h3{margin:8px 0 4px}.portal-class-overview p{margin:0;color:var(--ink-3);font-size:.8rem}.portal-manage-section{background:var(--surface);border:1px solid var(--line);border-radius:16px;padding:18px}.portal-manage-head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px}.portal-manage-head>div{display:flex;align-items:center;gap:10px}.portal-manage-head>div>span{width:28px;height:28px;display:grid;place-items:center;border-radius:9px;background:var(--accent);color:#fff;font-weight:900}.portal-manage-head h3,.portal-manage-head p{margin:0}.portal-manage-head h3{font-size:1rem}.portal-manage-head p{font-size:.72rem;color:var(--ink-3);margin-top:2px}.portal-member-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.portal-member-toggle{display:flex;align-items:center;gap:9px;border:1px solid var(--line);border-radius:11px;padding:10px;cursor:pointer}.portal-member-toggle:has(input:checked){background:var(--accent-soft);border-color:color-mix(in srgb,var(--accent) 32%,transparent)}.portal-member-toggle input{accent-color:var(--accent)}.portal-member-toggle b,.portal-member-toggle small{display:block}.portal-member-toggle b{font-size:.78rem}.portal-member-toggle small{font-size:.68rem;color:var(--ink-3);margin-top:2px}.portal-manage-list{display:grid;gap:8px}.portal-manage-row{display:flex;justify-content:space-between;align-items:center;gap:14px;border:1px solid var(--line);border-radius:12px;padding:12px}.portal-row-title{font-weight:800;font-size:.86rem}.portal-row-meta{display:flex;gap:8px;flex-wrap:wrap;margin-top:4px}.portal-row-meta span{font-size:.68rem;color:var(--ink-3)}.portal-row-actions{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.portal-danger{color:var(--err)!important}.portal-manage-empty{min-height:360px;display:grid;place-items:center;text-align:center;padding:30px}.portal-manage-empty>div{max-width:430px}.portal-manage-empty h3{font-size:1.25rem;margin:10px 0 6px}.portal-manage-empty p{color:var(--ink-3);line-height:1.6}.portal-empty-icon{font-size:2rem}
.portal-modal[hidden]{display:none}.portal-modal{position:fixed;inset:0;z-index:999;display:grid;place-items:center;padding:18px}.portal-modal-backdrop{position:absolute;inset:0;background:rgba(5,10,20,.62);backdrop-filter:blur(4px)}.portal-modal-dialog{position:relative;width:min(720px,100%);max-height:min(88vh,850px);overflow:auto;padding:24px;z-index:1}.portal-modal-close{position:absolute;right:12px;top:10px;width:34px;height:34px;border:0;border-radius:10px;background:var(--surface-2);color:var(--ink);font-size:1.3rem;cursor:pointer}.portal-modal-kicker{text-transform:uppercase;letter-spacing:.12em;color:var(--accent);font-size:.68rem;font-weight:900;padding-right:36px}.portal-modal-dialog h2{margin:6px 0 20px}.portal-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:13px}.portal-field{display:grid;gap:6px}.portal-field.full,.portal-check.full{grid-column:1/-1}.portal-field>span{font-size:.76rem;font-weight:800;color:var(--ink-2)}.portal-field small{font-size:.7rem;color:var(--ink-3)}.portal-code-input{font-family:"SFMono-Regular",Consolas,monospace;font-size:.78rem;line-height:1.55;resize:vertical;min-height:130px}.portal-check{display:flex;align-items:flex-start;gap:9px;padding:11px;border:1px solid var(--line);border-radius:11px;background:var(--surface-2)}.portal-check input{margin-top:3px;accent-color:var(--accent)}.portal-check b,.portal-check small{display:block}.portal-check small{font-size:.7rem;color:var(--ink-3);margin-top:2px}.portal-form-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:20px}.portal-input-suffix{position:relative}.portal-input-suffix .input{padding-right:52px}.portal-input-suffix span{position:absolute;right:13px;top:50%;transform:translateY(-50%);font-size:.72rem;color:var(--ink-3)}.portal-source-tools{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.portal-source-tools>span{margin-left:auto;font-size:.72rem;color:var(--ink-3)}.portal-file-button{position:relative;overflow:hidden;cursor:pointer}.portal-file-button input{position:absolute;inset:0;opacity:0;cursor:pointer}.portal-modal-open{overflow:hidden}.portal-toast{position:fixed;right:18px;bottom:18px;z-index:1200;max-width:min(420px,calc(100vw - 36px));padding:12px 15px;border-radius:12px;background:var(--ink);color:var(--bg);box-shadow:var(--shadow);font-size:.8rem;font-weight:700;transform:translateY(130%);opacity:0;transition:.22s}.portal-toast.show{transform:translateY(0);opacity:1}.portal-toast.ok{background:var(--ok);color:#fff}.portal-toast.err{background:var(--err);color:#fff}
@media(max-width:900px){.portal-manage-layout{grid-template-columns:1fr}.portal-class-sidebar{position:static}.portal-class-select-list{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:720px){.portal-nav-link{padding:8px 6px;font-size:.68rem}}
@media(max-width:720px){.portal-topbar-inner{padding:9px 12px;gap:7px}.portal-logo img{width:36px;height:36px}.portal-logo-copy span{display:none}.portal-logo-copy b{max-width:90px}.portal-nav{gap:2px}.portal-nav button{padding:8px 6px;font-size:.68rem}.portal-topbar .btn{padding:7px;font-size:0}.portal-topbar .btn[aria-label]{font-size:.8rem}.portal-topbar .btn:last-child:before{content:'↪';font-size:.9rem}.portal-shell{padding:24px 13px 72px}.portal-hero{grid-template-columns:1fr;padding:20px}.portal-identity{justify-content:flex-start}.portal-stats{grid-template-columns:repeat(3,1fr)}.portal-stat{padding:12px}.portal-stat b{font-size:1.15rem}.portal-stat span{font-size:.66rem}.portal-exam{grid-template-columns:1fr}.portal-exam .btn{width:100%;justify-content:center}.portal-class-heading{align-items:flex-start}.portal-class-heading h3{font-size:1.08rem}.portal-lesson summary{grid-template-columns:auto minmax(0,1fr);padding:13px}.portal-lesson summary>.portal-chip{grid-column:2}.portal-class-select-list{grid-template-columns:1fr}.portal-class-overview,.portal-manage-head,.portal-manage-row{align-items:stretch;flex-direction:column}.portal-member-grid{grid-template-columns:1fr}.portal-row-actions .btn{flex:1;justify-content:center}.portal-form-grid{grid-template-columns:1fr}.portal-field.full,.portal-check.full{grid-column:auto}.portal-form-actions .btn{flex:1;justify-content:center}.portal-modal{padding:8px}.portal-modal-dialog{padding:20px 16px;max-height:94vh}}
