:root{color:#202924;background:#f7f8f4;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-synthesis:none;text-rendering:optimizeLegibility}*{box-sizing:border-box}body{margin:0;min-width:320px}button,input{font:inherit}button{cursor:pointer}.app-header{align-items:center;background:#f7f8f4eb;border-bottom:1px solid #dfe5dc;display:flex;justify-content:space-between;padding:18px clamp(18px,4vw,56px);position:sticky;top:0;z-index:10}.school-label{color:#637065;font-size:12px;font-weight:700;letter-spacing:0;margin:0 0 4px;text-transform:uppercase}h1,h2,h3,p{margin-top:0}h1{font-size:clamp(22px,3vw,32px);line-height:1.1;margin-bottom:0}.app-header nav{align-items:center;background:#e8eee8;border:1px solid #d6ded5;border-radius:8px;display:flex;gap:4px;padding:4px}.app-header nav button{background:transparent;border:0;border-radius:6px;color:#4f5c53;font-size:14px;font-weight:700;padding:9px 14px}.app-header nav button.active{background:#fff;box-shadow:0 1px 8px #2029241a;color:#18241d}.upload-page,.admin-page{margin:0 auto;max-width:1180px;padding:26px clamp(18px,4vw,56px) 56px}.hero{border-radius:8px;min-height:310px;overflow:hidden;position:relative}.hero img{display:block;height:100%;inset:0;object-fit:cover;position:absolute;width:100%}.hero:after{background:linear-gradient(90deg,#f7f8f4f5,#f7f8f4c2 32%,#f7f8f41a 68%);content:"";inset:0;position:absolute}.hero-copy{max-width:520px;padding:clamp(28px,6vw,56px);position:relative;z-index:1}.hero-copy h2{font-size:clamp(32px,6vw,58px);line-height:1.04;margin-bottom:18px}.hero-copy p{color:#526157;font-size:17px;line-height:1.7;margin-bottom:0}.workspace{align-items:start;display:grid;gap:18px;grid-template-columns:minmax(290px,380px) 1fr;margin-top:18px}.upload-panel,.asset-list,.admin-login,.table-wrap{background:#fff;border:1px solid #dfe5dc;border-radius:8px;box-shadow:0 16px 40px #27342b14}.upload-panel{display:grid;gap:16px;padding:18px}.field{display:grid;gap:8px}.field label{color:#4d5b50;font-size:13px;font-weight:800}.field input,.admin-actions input,.admin-login input{background:#fbfcf8;border:1px solid #cbd5ca;border-radius:8px;color:#1e2a23;height:44px;outline:none;padding:0 13px}.field input:focus,.admin-actions input:focus,.admin-login input:focus{border-color:#4f8f68;box-shadow:0 0 0 3px #4f8f682e}.drop-zone{align-items:center;background:#f2f6f1;border:1px dashed #9caf9f;border-radius:8px;color:#385443;display:grid;gap:6px;justify-items:center;min-height:168px;padding:24px;text-align:center}.drop-zone input{display:none}.drop-zone.disabled{opacity:.5}.notice{background:#fff7dd;border:1px solid #f0d995;border-radius:8px;color:#72551d;font-size:13px;margin:0;padding:10px 12px}.primary-action,.admin-actions button,.admin-login button,.row-actions button{align-items:center;background:#1f6f43;border:0;border-radius:8px;color:#fff;display:inline-flex;font-weight:800;gap:8px;justify-content:center;min-height:44px;padding:0 16px}.primary-action:disabled{background:#aeb8ae;cursor:not-allowed}.asset-list{min-height:340px;padding:18px}.list-title,.asset-heading,.admin-toolbar,.admin-actions{align-items:center;display:flex;justify-content:space-between}.list-title h3,.admin-toolbar h2{margin-bottom:0}.list-title span{color:#617067;font-weight:800}.asset-row{align-items:center;border-top:1px solid #edf1ec;display:grid;gap:12px;grid-template-columns:40px 1fr auto auto;min-height:76px;padding:14px 0}.asset-icon{align-items:center;background:#eaf2eb;border-radius:8px;color:#2b7a4b;display:flex;height:40px;justify-content:center;width:40px}.asset-heading{gap:14px}.asset-heading strong{overflow-wrap:anywhere}.asset-heading span,.asset-main p{color:#657166;font-size:13px}.asset-main p{margin-bottom:8px}.meter{background:#e8eee7;border-radius:999px;height:7px;overflow:hidden}.meter span{background:#d33f31;display:block;height:100%;transition:width .16s ease}.status-badge,.table-status{align-items:center;border-radius:999px;display:inline-flex;font-size:12px;font-weight:800;gap:6px;padding:7px 10px}.status-badge.pending,.table-status.ready{background:#eaf2eb;color:#286a42}.status-badge.uploading,.table-status.queued,.table-status.processing{background:#fff1cf;color:#7a5814}.status-badge.done,.table-status.processed{background:#e4f4ff;color:#225b7a}.status-badge.error,.table-status.failed{background:#ffe2de;color:#9b2d23}.spin{animation:spin .9s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.icon-button{align-items:center;background:#f3f5f0;border:1px solid #dfe5dc;border-radius:8px;color:#526157;display:flex;height:36px;justify-content:center;width:36px}.empty-state{align-items:center;color:#788578;display:grid;gap:10px;justify-items:center;min-height:230px}.admin-toolbar{gap:20px;margin-bottom:16px}.admin-toolbar p{color:#647166;margin:8px 0 0}.admin-actions{gap:10px}.admin-lock{align-items:center;background:#eef4ec;border:1px solid #d8e4d7;border-radius:8px;color:#445348;display:flex;gap:8px;margin-bottom:14px;padding:12px 14px}.admin-login{display:grid;gap:12px;max-width:520px;padding:18px}.admin-login label{color:#4d5b50;font-size:13px;font-weight:800}.admin-login-row{display:grid;gap:10px;grid-template-columns:1fr auto}.admin-actions .secondary-action{background:#edf2ec;border:1px solid #d5ded3;color:#46534a}.table-wrap{overflow-x:auto}table{border-collapse:collapse;min-width:940px;width:100%}th,td{border-bottom:1px solid #edf1ec;padding:14px;text-align:left;vertical-align:middle}th{color:#5a665d;font-size:12px;text-transform:uppercase}.object-key{color:#526157;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;max-width:320px;overflow-wrap:anywhere}.row-actions{display:flex;gap:8px}.row-actions button{height:34px;min-height:34px;padding:0;width:34px}@media(max-width:820px){.app-header,.admin-toolbar{align-items:stretch;flex-direction:column}.workspace,.admin-login-row{grid-template-columns:1fr}.hero{min-height:420px}.hero:after{background:linear-gradient(180deg,#f7f8f4f2,#f7f8f4bd 52%,#f7f8f42e)}.asset-row{grid-template-columns:40px 1fr}.status-badge,.icon-button{justify-self:start}}
