*,*:before,*:after{box-sizing:border-box}body{margin:0}#root{min-height:100vh}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--nus-orange: #ef7c00;--nus-orange-dark: #c96800;--bg: #f4f5f7;--surface: #ffffff;--border: #e0e0e0;--text: #1a1a1a;--text-muted: #888;--radius: 10px;--shadow: 0 2px 12px rgba(0,0,0,.08);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}body{background:var(--bg);color:var(--text)}.app{min-height:100vh;display:flex;flex-direction:column}main{flex:1;max-width:1100px;width:100%;margin:32px auto;padding:0 20px}header{background:var(--nus-orange);color:#fff;padding:0 24px;box-shadow:0 2px 8px #00000026;position:sticky;top:0;z-index:100}.header-inner{max-width:1100px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:18px 0;gap:16px}.header-title h1{font-size:1.4rem;font-weight:700;letter-spacing:-.3px}.header-title p{margin-top:4px;font-size:.86rem;font-weight:400;opacity:.9;line-height:1.35}.cumulative-gpa{text-align:right;display:flex;flex-direction:column;align-items:flex-end;gap:2px}.gpa-label{font-size:.72rem;opacity:.85;text-transform:uppercase;letter-spacing:.5px}.gpa-value{font-size:2.2rem;font-weight:800;line-height:1;color:#fff}.gpa-value.muted{opacity:.5}.gpa-units{font-size:.72rem;opacity:.75}.header-toolbar{padding:0 24px}.header-toolbar-inner{max-width:1100px;margin:0 auto;padding:6px 0;display:flex;justify-content:flex-end;gap:8px}.btn-header-tool{background:transparent;color:var(--text-muted);border:1px solid var(--border);border-radius:6px;padding:4px 12px;font-size:.78rem;font-weight:500;cursor:pointer;font-family:inherit;transition:border-color .15s,color .15s}.btn-header-tool:hover{border-color:var(--nus-orange);color:var(--nus-orange)}.upload-section{display:flex;flex-direction:column;align-items:center;gap:20px;padding:40px 0}.upload-instructions{width:100%;max-width:520px;background:#fff8f0;border:1px solid #f5d9b8;border-radius:var(--radius);padding:14px 20px 14px 36px;font-size:.88rem;line-height:1.7;color:var(--text)}.upload-instructions li::marker{color:var(--nus-orange);font-weight:600}.upload-zone{width:100%;max-width:520px;background:var(--surface);border:2px dashed var(--border);border-radius:var(--radius);padding:56px 32px;text-align:center;cursor:pointer;transition:border-color .2s,background .2s}.upload-zone:hover,.upload-zone.dragging{border-color:var(--nus-orange);background:#fff8f0}.upload-icon{font-size:3rem;margin-bottom:12px}.upload-title{font-size:1.05rem;font-weight:600;margin-bottom:6px}.upload-sub{color:var(--text-muted);font-size:.9rem}.loading-state{display:flex;flex-direction:column;align-items:center;gap:14px;color:var(--text-muted)}.loading-bar{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--surface);border-radius:var(--radius);margin-bottom:16px;font-size:.9rem;color:var(--text-muted);box-shadow:var(--shadow)}.spinner{width:20px;height:20px;border:3px solid #e0e0e0;border-top-color:var(--nus-orange);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.divider{width:100%;max-width:520px;display:flex;align-items:center;gap:12px;color:var(--text-muted);font-size:.85rem}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--border)}.error{color:#c0392b;background:#fdf3f3;border:1px solid #f5c6cb;border-radius:6px;padding:10px 14px;font-size:.9rem;max-width:520px}.semester-block{background:var(--surface);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:24px;overflow:hidden}.semester-heading{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;background:#fafafa;border-bottom:1px solid var(--border)}.semester-heading h2{font-size:.95rem;font-weight:600;color:var(--text)}.sem-gpa{font-size:.88rem;color:var(--text-muted);background:#f0f0f0;padding:3px 10px;border-radius:20px}.sem-gpa strong{color:var(--nus-orange)}.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}table{width:max-content;min-width:100%;border-collapse:collapse;font-size:.88rem}thead th{background:#f7f7f7;padding:10px 12px;text-align:left;font-weight:600;font-size:.78rem;text-transform:uppercase;letter-spacing:.4px;color:var(--text-muted);border-bottom:1px solid var(--border);white-space:nowrap}tbody tr{border-bottom:1px solid #f0f0f0;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#fafafa}tbody tr.row-su{opacity:.55}td{padding:8px 12px;vertical-align:middle}.col-code{width:140px}.col-grade{width:90px}.col-units{width:70px}.col-su{width:50px;text-align:center}.col-pts{width:100px;text-align:right}.col-del{width:40px}.col-su-cell{text-align:center}.col-pts-cell{text-align:right;font-variant-numeric:tabular-nums;font-weight:500}.col-drag{width:20px;padding:0 4px!important}.drag-handle{display:block;text-align:center;color:#ddd;font-size:.95rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1}tbody tr:hover .drag-handle{color:#bbb}tbody tr[draggable]:active{cursor:grabbing}.semester-block.drop-target{outline:2px dashed var(--nus-orange);outline-offset:-2px}.semester-block.drop-target .semester-heading{background:#fff3e6}tr.drop-above td{box-shadow:inset 0 2px 0 var(--nus-orange)}tr.drop-below td{box-shadow:inset 0 -2px 0 var(--nus-orange)}input[type=text],input[type=number],input:not([type=checkbox]):not([type=file]),select{border:1px solid transparent;border-radius:5px;padding:5px 7px;font-size:.875rem;font-family:inherit;background:transparent;color:var(--text);width:100%;transition:border-color .15s,background .15s}input:not([type=checkbox]):not([type=file]):focus,select:focus{outline:none;border-color:var(--nus-orange);background:#fff8f0}.inp-code{display:block;min-width:120px;font-family:Courier New,monospace;font-weight:600}.inp-name{display:block;min-width:280px}.inp-units{width:60px;text-align:center}.sel-grade{width:70px;cursor:pointer}.chk-su{width:16px;height:16px;accent-color:var(--nus-orange);cursor:pointer}.btn{display:inline-flex;align-items:center;gap:6px;padding:9px 18px;border-radius:7px;font-size:.88rem;font-weight:500;cursor:pointer;border:none;transition:background .15s,transform .1s;font-family:inherit}.btn:active{transform:scale(.97)}.btn-primary{background:var(--nus-orange);color:#fff}.btn-primary:hover{background:var(--nus-orange-dark)}.btn-secondary{background:#fff;color:var(--text);border:1.5px solid var(--border)}.btn-secondary:hover{border-color:var(--nus-orange);color:var(--nus-orange)}.btn-ghost{background:transparent;color:var(--text-muted);border:1.5px solid transparent}.btn-ghost:hover{background:#f0f0f0;color:var(--text)}.btn-add-row{display:block;width:100%;border-radius:0;border-top:1px dashed var(--border);padding:10px;text-align:center;color:var(--text-muted);font-size:.85rem}.btn-add-row:hover{background:#fafafa;color:var(--nus-orange)}.btn-del{background:none;border:none;color:#ccc;cursor:pointer;font-size:.8rem;padding:4px 7px;border-radius:4px;transition:color .15s,background .15s;font-family:inherit}.btn-del:hover{color:#c0392b;background:#fdf3f3}.sem-heading-right{display:flex;align-items:center;gap:8px}.btn-delete-sem{background:none;border:none;cursor:pointer;font-size:.95rem;padding:3px 6px;border-radius:4px;opacity:.4;transition:opacity .15s,background .15s;line-height:1}.btn-delete-sem:hover{opacity:1;background:#fdf3f3}.add-sem-card{display:flex;align-items:center;gap:10px;padding:14px 18px;background:var(--surface);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:16px;flex-wrap:wrap}.add-sem-label{font-size:.88rem;font-weight:500;color:var(--text-muted);white-space:nowrap}.sel-ay,.sel-semtype{width:auto;padding:7px 10px;border:1.5px solid var(--border);border-radius:6px;background:#fff;cursor:pointer}.sel-ay:focus,.sel-semtype:focus{border-color:var(--nus-orange);background:#fff8f0}.td-code{position:relative;min-width:130px}.td-name{min-width:280px}.code-input-wrap{position:relative;width:100%}.suggestions{background:#fff;border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #00000024;list-style:none;padding:4px 0;max-height:260px;overflow-y:auto}.suggestion-item{display:flex;align-items:baseline;gap:10px;padding:8px 12px;cursor:pointer;transition:background .1s}.suggestion-item:hover,.suggestion-item.highlighted{background:#fff3e6}.sug-code{font-family:Courier New,monospace;font-weight:700;font-size:.82rem;color:var(--nus-orange);white-space:nowrap;min-width:80px}.sug-title{font-size:.82rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.header-degree-gpas{display:flex;gap:20px;align-items:center}.header-degree-gpa{text-align:right;display:flex;flex-direction:column;align-items:flex-end;gap:2px}.header-degree-gpas .header-degree-gpa+.header-degree-gpa{padding-left:20px;border-left:1px solid rgba(255,255,255,.3)}.col-degree{width:110px}.sel-degree{width:auto;min-width:90px;cursor:pointer}.sem-footer{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:6px 0 2px}.nusmods-inline{display:flex;align-items:center;gap:6px;width:100%}.nusmods-block{display:flex;flex:1;flex-direction:column;gap:6px;min-width:0}.inp-nusmods{flex:1;min-width:0;padding:6px 10px;border:1px solid var(--border);border-radius:var(--radius);font-size:.83rem;background:var(--surface);color:var(--text)}.nusmods-err{margin:0;max-width:none;width:100%;font-size:.82rem}.bottom-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px}.muted{color:var(--text-muted)}footer{text-align:center;padding:24px 20px;font-size:.78rem;color:var(--text-muted);border-top:1px solid var(--border);display:flex;flex-direction:column;gap:4px}@media (max-width: 600px){.header-inner{flex-direction:column;align-items:flex-start}.cumulative-gpa{align-items:flex-start}.gpa-value{font-size:1.8rem}.table-wrap table{min-width:900px}.td-name,.inp-name{min-width:320px}}
