*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}body{font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;background:#f5f6fa;color:#1a1a2e;min-height:100vh;font-size:14px}a{color:inherit;text-decoration:none}button{cursor:pointer;font-family:inherit}.container{max-width:960px;margin:0 auto;padding:0 1.5rem}.navbar{background:#fff;border-bottom:1px solid #e8e8e8;padding:0;height:56px;display:flex;align-items:center;box-shadow:0 1px 3px #0000000f}.navbar .inner{display:flex;align-items:center;justify-content:space-between;width:100%}.navbar .brand{font-size:1rem;font-weight:700;color:#1a1a2e;display:flex;align-items:center;gap:.5rem}.navbar .brand span{font-size:1.1rem}.navbar .nav-link{background:#2563eb;color:#fff;font-weight:600;font-size:.8rem;padding:.45rem 1rem;border-radius:6px;border:none;letter-spacing:.01em;transition:background .15s}.navbar .nav-link:hover{background:#1d4ed8}.page{padding:2rem 0}.card{background:#fff;border:1px solid #e8e8e8;border-radius:10px;padding:1.75rem;box-shadow:0 1px 4px #0000000d}.page-title{font-size:1.1rem;font-weight:700;margin-bottom:1.25rem;color:#1a1a2e}.empty-state{text-align:center;padding:3.5rem 1rem;color:#9ca3af}.empty-state .icon{font-size:2.5rem;margin-bottom:.75rem}.empty-state p{font-size:.875rem}.jobs-table{width:100%;border-collapse:collapse;font-size:.85rem}.jobs-table th{text-align:left;padding:.6rem 1rem;background:#f9fafb;color:#6b7280;font-weight:600;font-size:.75rem;text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid #e8e8e8;border-top:1px solid #e8e8e8}.jobs-table td{padding:.85rem 1rem;border-bottom:1px solid #f3f4f6;color:#374151;vertical-align:middle}.jobs-table tr:last-child td{border-bottom:none}.jobs-table tr:hover td{background:#f9fafb}.btn-view{background:transparent;border:1px solid #d1d5db;color:#374151;font-size:.78rem;font-weight:500;padding:.3rem .75rem;border-radius:5px;transition:all .15s}.btn-view:hover{border-color:#2563eb;color:#2563eb;background:#eff6ff}.badge{display:inline-block;padding:.2rem .6rem;border-radius:4px;font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.badge-pending{background:#eff6ff;color:#3b82f6}.badge-processing{background:#fefce8;color:#ca8a04}.badge-done{background:#f0fdf4;color:#16a34a}.badge-error{background:#fef2f2;color:#dc2626}.upload-card{max-width:520px;margin:0 auto}.upload-card h2{font-size:1rem;font-weight:700;margin-bottom:1.5rem;color:#1a1a2e;padding-bottom:1rem;border-bottom:1px solid #f3f4f6}.form-group{margin-bottom:1.1rem}.form-group label{display:block;font-size:.8rem;font-weight:600;color:#374151;margin-bottom:.4rem}.form-group input[type=text],.form-group input[type=password]{width:100%;background:#fff;border:1px solid #d1d5db;border-radius:6px;padding:.6rem .85rem;color:#1a1a2e;font-size:.875rem;outline:none;transition:border-color .15s,box-shadow .15s}.form-group input:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb14}.dropzone{border:1.5px dashed #d1d5db;border-radius:8px;padding:2rem 1rem;text-align:center;cursor:pointer;background:#fafafa;transition:border-color .2s,background .2s}.dropzone:hover,.dropzone.active{border-color:#2563eb;background:#eff6ff}.dropzone .dz-icon{font-size:2rem;margin-bottom:.5rem}.dropzone p{color:#6b7280;font-size:.85rem}.dropzone .file-name{margin-top:.6rem;color:#2563eb;font-size:.82rem;font-weight:600}.btn-primary{width:100%;background:#2563eb;color:#fff;font-weight:600;font-size:.9rem;padding:.7rem;border:none;border-radius:7px;margin-top:.5rem;letter-spacing:.01em;transition:background .15s}.btn-primary:hover:not(:disabled){background:#1d4ed8}.btn-primary:disabled{opacity:.45;cursor:not-allowed}.error-msg{background:#fef2f2;color:#dc2626;border:1px solid #fecaca;border-radius:6px;padding:.65rem .9rem;font-size:.82rem;margin-bottom:1rem}.back-link{display:inline-flex;align-items:center;gap:.35rem;color:#6b7280;font-size:.82rem;margin-bottom:1.25rem;transition:color .15s}.back-link:hover{color:#1a1a2e}.job-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:1.5rem;gap:1rem;flex-wrap:wrap;padding-bottom:1.25rem;border-bottom:1px solid #f3f4f6}.job-header h2{font-size:1rem;font-weight:700;color:#1a1a2e;word-break:break-all}.job-header p{color:#9ca3af;font-size:.78rem;margin-top:.2rem}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-bottom:1.5rem}.stat-box{background:#f9fafb;border:1px solid #e8e8e8;border-radius:8px;padding:1rem;text-align:center}.stat-box .stat-value{font-size:1.6rem;font-weight:700;color:#1a1a2e}.stat-box .stat-label{font-size:.7rem;color:#9ca3af;margin-top:.2rem;text-transform:uppercase;letter-spacing:.06em;font-weight:600}.progress-wrap{margin-bottom:1.5rem}.progress-label{display:flex;justify-content:space-between;font-size:.78rem;color:#6b7280;font-weight:500;margin-bottom:.4rem}.progress-track{background:#f3f4f6;border-radius:999px;height:8px;overflow:hidden;border:1px solid #e8e8e8}.progress-fill{height:100%;border-radius:999px;background:#2563eb;transition:width .5s ease}.progress-fill.done{background:#16a34a}.progress-fill.error{background:#dc2626}.btn-download{display:inline-flex;align-items:center;gap:.5rem;background:#16a34a;color:#fff;font-weight:600;font-size:.875rem;padding:.65rem 1.5rem;border:none;border-radius:7px;transition:background .15s}.btn-download:hover{background:#15803d}.processing-msg{display:flex;align-items:center;gap:.5rem;color:#6b7280;font-size:.82rem}.spinner{width:14px;height:14px;border:2px solid #e8e8e8;border-top-color:#2563eb;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.error-box{background:#fef2f2;border:1px solid #fecaca;border-radius:8px;padding:.9rem 1.1rem;color:#dc2626;font-size:.82rem}
