:root{--bg: #f7f8fa;--surface: #ffffff;--border: #e3e6eb;--text: #1a1f29;--muted: #6b7280;--primary: #1147a3;--primary-hover: #0e3a86;--ok: #15803d;--warn: #b45309;--danger: #b91c1c;--info-bg: #e6f4ff;--info-bd: #91caff;--suspect-bg: #fff7e6;--suspect-bd: #ffd591;--fixed-bg: #f0fdf4;--fixed-bd: #86efac}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font:14px/1.45 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}.app{min-height:100%;display:flex;flex-direction:column}.container{max-width:1200px;margin:0 auto;padding:20px}.row{display:flex;align-items:center}.row.spaced{justify-content:space-between}.row.gap>*+*{margin-left:8px}.gap>*+*{margin-left:8px}.muted{color:var(--muted)}.small{font-size:12px}button,.btn{display:inline-flex;align-items:center;gap:4px;background:var(--surface);border:1px solid var(--border);padding:6px 12px;border-radius:6px;cursor:pointer;font:inherit;color:var(--text);text-decoration:none}button:hover,.btn:hover{background:#f0f2f5}button:disabled{opacity:.5;cursor:not-allowed}button.primary,.primary{background:var(--primary);color:#fff;border-color:var(--primary)}button.primary:hover{background:var(--primary-hover)}button.danger{background:#fee2e2;border-color:#fca5a5;color:var(--danger)}button.danger.active,button.danger:hover{background:var(--danger);color:#fff}button.link{background:none;border:none;color:var(--primary);padding:0}button.insta{background:var(--ok);border-color:var(--ok);animation:pulse 2s ease-in-out infinite}@keyframes pulse{50%{box-shadow:0 0 0 6px #15803d26}}input,select,textarea{font:inherit;padding:8px;border:1px solid var(--border);border-radius:6px;background:var(--surface);display:block;width:100%}label{display:block;margin:8px 0;font-weight:500}label small{font-weight:400;color:var(--muted);margin-left:4px}.err{background:#fee2e2;border:1px solid #fca5a5;padding:8px 12px;border-radius:6px;margin:8px 0;color:var(--danger);white-space:pre-wrap}.info{background:var(--info-bg);border:1px solid var(--info-bd);padding:8px 12px;border-radius:6px;margin:8px 0}.sticky{position:sticky;top:56px;z-index:5}.card{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:16px;margin:12px 0}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}.topbar{display:flex;align-items:center;gap:16px;background:var(--surface);border-bottom:1px solid var(--border);padding:8px 20px;position:sticky;top:0;z-index:10}.topbar .brand{font-weight:700}.topbar .brand a{color:var(--text)}.topbar nav{display:flex;gap:16px;flex:1;padding-left:16px}.topbar nav a{color:var(--text)}.topbar .user-area{display:flex;align-items:center;gap:8px}.user-name{color:var(--muted)}.login-wrap{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:24px}.login-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:24px;max-width:380px;width:100%;box-shadow:0 2px 16px #0000000d}.login-card h1{margin:0 0 4px}.book-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;margin-top:12px}.book-card{display:block;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:16px;color:var(--text)}.book-card:hover{border-color:var(--primary);text-decoration:none}.book-title{font-weight:600}.book-slug{color:var(--muted);font-family:monospace;font-size:12px;margin:4px 0}.book-stats{display:flex;gap:8px;align-items:center;margin-top:8px;font-size:12px;color:var(--muted)}.pill{display:inline-block;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:500;background:#eef2f7;color:#475569}.pill.status-approved{background:#dcfce7;color:#15803d}.pill.status-in_review{background:var(--info-bg);color:var(--primary)}.pill.status-ocr_running,.pill.status-uploaded,.pill.status-processing{background:#fef3c7;color:#92400e}.pill.status-failed{background:#fee2e2;color:var(--danger)}.pill.status-compiled{background:#cffafe;color:#0e7490}.pill.status-detected{background:var(--suspect-bg);color:var(--warn)}.pill.status-rejected{background:#f3f4f6;color:#6b7280;text-decoration:line-through}.pill.status-uploaded{background:#dcfce7;color:#15803d}.pill.pill-fail{background:#fee2e2;color:var(--danger)}.pill.auto-fix{background:var(--fixed-bg);color:var(--ok);border:1px solid var(--fixed-bd)}.pill.suspect{background:var(--suspect-bg);color:var(--warn);border:1px solid var(--suspect-bd)}.page-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:6px;margin-top:8px}.page-tile{display:flex;flex-direction:column;gap:4px;padding:10px;background:var(--surface);border:1px solid var(--border);border-radius:6px;text-align:center;color:var(--text);font-size:12px}.page-tile:hover{border-color:var(--primary);text-decoration:none}.page-tile.status-approved{background:#f0fdf4;border-color:#bbf7d0}.page-tile.status-failed{background:#fef2f2;border-color:#fecaca}.page-tile.status-in_review{background:var(--info-bg);border-color:var(--info-bd)}.page-no{font-weight:600}.page-status{color:var(--muted)}.page-conf.high{color:var(--ok);font-weight:600}.page-conf.mid{color:var(--warn)}.page-conf.low{color:var(--danger)}.review-wrap{display:flex;flex-direction:column;height:calc(100vh - 56px)}.review-bar{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;background:var(--surface);border-bottom:1px solid var(--border)}.conf-badge{padding:2px 8px;border-radius:999px;font-size:12px;font-weight:500;background:#eef2f7}.conf-badge.high{background:#dcfce7;color:var(--ok)}.conf-badge.mid{background:#fef3c7;color:var(--warn)}.conf-badge.low{background:#fee2e2;color:var(--danger)}.review-grid{display:grid;grid-template-columns:1.3fr 1.5fr 1.2fr;gap:1px;background:var(--border);flex:1;min-height:0}.review-grid>section{background:var(--surface);display:flex;flex-direction:column;min-width:0}.col-h{padding:8px 12px;font-weight:500;border-bottom:1px solid var(--border);background:#fafbfc;flex-shrink:0}.scan-wrap{flex:1;overflow:auto;padding:8px;background:#f3f4f6}.scan-wrap img{display:block;max-width:100%;height:auto;margin:0 auto}.preview-html{flex:1;overflow:auto;padding:12px 16px}.content-html h1,.content-html h2,.content-html h3,.content-html h4{margin:.6em 0 .3em;color:#1147a3}.content-html aside{border-left:4px solid var(--primary);background:#f1f5f9;padding:8px 12px;margin:8px 0;border-radius:4px}.content-html aside.clinical-pearl{border-color:#15803d;background:#f0fdf4}.content-html aside.warning{border-color:var(--warn);background:#fffbeb}.content-html aside.mnemonic{border-color:#7c3aed;background:#faf5ff}.content-html aside.key-concept{border-color:var(--primary);background:var(--info-bg)}.content-html table{border-collapse:collapse;width:100%;margin:8px 0}.content-html th,.content-html td{border:1px solid var(--border);padding:6px 10px;text-align:left}.content-html th{background:#f9fafb}.content-html span.drug{color:var(--danger);font-weight:500}.content-html span.anatomy{color:#7c3aed}.content-html [data-needs-review=suspect]{background:var(--suspect-bg);border-bottom:2px dotted var(--warn);cursor:help}.content-html [data-needs-review=auto-fixed]{background:var(--fixed-bg);border-bottom:2px dotted var(--ok);cursor:help}.review-grid-bottom{display:grid;grid-template-columns:2fr 1fr;gap:16px;padding:16px;background:var(--bg)}.img-strip{display:flex;gap:12px;overflow-x:auto;padding:8px 0}.img-card{flex:0 0 220px;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:8px;display:flex;flex-direction:column;gap:6px}.img-card.approved{border-color:var(--ok);background:#f0fdf4}.img-card.rejected{opacity:.4}.img-card.uploaded{border-color:var(--ok);background:#f0fdf4}.img-thumb{height:120px;overflow:hidden;background:#f3f4f6;border-radius:4px}.img-thumb img{width:100%;height:100%;object-fit:contain}.img-meta{font-size:12px}.img-meta code{font-size:11px}.caption{color:var(--muted);font-size:12px}.img-actions{display:flex;gap:4px}.img-actions button{font-size:12px;padding:4px 8px;flex:1}.report-list{list-style:none;padding:0;margin:0}.report-list li{padding:8px 0;border-bottom:1px solid var(--border)}.report-list li.clickable{cursor:pointer}.report-list li.clickable:hover{background:#f9fafb}code.strike{text-decoration:line-through;color:var(--muted)}code.ok{color:var(--ok);font-weight:600}code.suspect{background:var(--suspect-bg);padding:1px 4px;border-radius:3px}.auto-fix-h{color:var(--ok);margin-top:12px}.suspect-h{color:var(--warn);margin-top:12px}.tbl{width:100%;border-collapse:collapse}.tbl th,.tbl td{padding:8px;border-bottom:1px solid var(--border);text-align:left}.tbl th{background:#f9fafb}.processing{display:flex;align-items:center;gap:12px;padding:24px;background:var(--info-bg);border-bottom:1px solid var(--info-bd)}.spinner{width:20px;height:20px;border:2px solid #c0d8f5;border-top-color:var(--primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.modal-bg{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;z-index:100;display:flex;align-items:center;justify-content:center}.modal{background:var(--surface);border-radius:8px;padding:20px;max-width:900px;max-height:90vh;overflow:auto}@keyframes marching-ants{0%{background-position:0 0,0 100%,0 0,100% 0}to{background-position:20px 0,-20px 100%,0 -20px,100% 20px}}:root{--rc-drag-handle-size: 12px;--rc-drag-handle-mobile-size: 24px;--rc-drag-handle-bg-colour: rgba(0, 0, 0, .2);--rc-drag-bar-size: 6px;--rc-border-color: rgba(255, 255, 255, .7);--rc-focus-color: #0088ff}.ReactCrop{position:relative;display:inline-block;cursor:crosshair;max-width:100%}.ReactCrop *,.ReactCrop *:before,.ReactCrop *:after{box-sizing:border-box}.ReactCrop--disabled,.ReactCrop--locked{cursor:inherit}.ReactCrop__child-wrapper{overflow:hidden;max-height:inherit}.ReactCrop__child-wrapper>img,.ReactCrop__child-wrapper>video{display:block;max-width:100%;max-height:inherit}.ReactCrop:not(.ReactCrop--disabled) .ReactCrop__child-wrapper>img,.ReactCrop:not(.ReactCrop--disabled) .ReactCrop__child-wrapper>video{touch-action:none}.ReactCrop:not(.ReactCrop--disabled) .ReactCrop__crop-selection{touch-action:none}.ReactCrop__crop-mask{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;width:calc(100% + .5px);height:calc(100% + .5px)}.ReactCrop__crop-selection{position:absolute;top:0;left:0;transform:translateZ(0);cursor:move}.ReactCrop--disabled .ReactCrop__crop-selection{cursor:inherit}.ReactCrop--circular-crop .ReactCrop__crop-selection{border-radius:50%}.ReactCrop--circular-crop .ReactCrop__crop-selection:after{pointer-events:none;content:"";position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;border:1px solid var(--rc-border-color);opacity:.3}.ReactCrop--no-animate .ReactCrop__crop-selection{outline:1px dashed white}.ReactCrop__crop-selection:not(.ReactCrop--no-animate .ReactCrop__crop-selection){animation:marching-ants 1s;background-image:linear-gradient(to right,#fff 50%,#444 50%),linear-gradient(to right,#fff 50%,#444 50%),linear-gradient(to bottom,#fff 50%,#444 50%),linear-gradient(to bottom,#fff 50%,#444 50%);background-size:10px 1px,10px 1px,1px 10px,1px 10px;background-position:0 0,0 100%,0 0,100% 0;background-repeat:repeat-x,repeat-x,repeat-y,repeat-y;color:#fff;animation-play-state:running;animation-timing-function:linear;animation-iteration-count:infinite}.ReactCrop__crop-selection:focus{outline:2px solid var(--rc-focus-color);outline-offset:-1px}.ReactCrop--invisible-crop .ReactCrop__crop-mask,.ReactCrop--invisible-crop .ReactCrop__crop-selection{display:none}.ReactCrop__rule-of-thirds-vt:before,.ReactCrop__rule-of-thirds-vt:after,.ReactCrop__rule-of-thirds-hz:before,.ReactCrop__rule-of-thirds-hz:after{content:"";display:block;position:absolute;background-color:#fff6}.ReactCrop__rule-of-thirds-vt:before,.ReactCrop__rule-of-thirds-vt:after{width:1px;height:100%}.ReactCrop__rule-of-thirds-vt:before{left:33.3333333333%}.ReactCrop__rule-of-thirds-vt:after{left:66.6666666667%}.ReactCrop__rule-of-thirds-hz:before,.ReactCrop__rule-of-thirds-hz:after{width:100%;height:1px}.ReactCrop__rule-of-thirds-hz:before{top:33.3333333333%}.ReactCrop__rule-of-thirds-hz:after{top:66.6666666667%}.ReactCrop__drag-handle{position:absolute;width:var(--rc-drag-handle-size);height:var(--rc-drag-handle-size);background-color:var(--rc-drag-handle-bg-colour);border:1px solid var(--rc-border-color)}.ReactCrop__drag-handle:focus{background:var(--rc-focus-color)}.ReactCrop .ord-nw{top:0;left:0;transform:translate(-50%,-50%);cursor:nw-resize}.ReactCrop .ord-n{top:0;left:50%;transform:translate(-50%,-50%);cursor:n-resize}.ReactCrop .ord-ne{top:0;right:0;transform:translate(50%,-50%);cursor:ne-resize}.ReactCrop .ord-e{top:50%;right:0;transform:translate(50%,-50%);cursor:e-resize}.ReactCrop .ord-se{bottom:0;right:0;transform:translate(50%,50%);cursor:se-resize}.ReactCrop .ord-s{bottom:0;left:50%;transform:translate(-50%,50%);cursor:s-resize}.ReactCrop .ord-sw{bottom:0;left:0;transform:translate(-50%,50%);cursor:sw-resize}.ReactCrop .ord-w{top:50%;left:0;transform:translate(-50%,-50%);cursor:w-resize}.ReactCrop__disabled .ReactCrop__drag-handle{cursor:inherit}.ReactCrop__drag-bar{position:absolute}.ReactCrop__drag-bar.ord-n{top:0;left:0;width:100%;height:var(--rc-drag-bar-size);transform:translateY(-50%)}.ReactCrop__drag-bar.ord-e{right:0;top:0;width:var(--rc-drag-bar-size);height:100%;transform:translate(50%)}.ReactCrop__drag-bar.ord-s{bottom:0;left:0;width:100%;height:var(--rc-drag-bar-size);transform:translateY(50%)}.ReactCrop__drag-bar.ord-w{top:0;left:0;width:var(--rc-drag-bar-size);height:100%;transform:translate(-50%)}.ReactCrop--new-crop .ReactCrop__drag-bar,.ReactCrop--new-crop .ReactCrop__drag-handle,.ReactCrop--fixed-aspect .ReactCrop__drag-bar,.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-n,.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-e,.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-s,.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-w{display:none}@media (pointer: coarse){.ReactCrop .ord-n,.ReactCrop .ord-e,.ReactCrop .ord-s,.ReactCrop .ord-w{display:none}.ReactCrop__drag-handle{width:var(--rc-drag-handle-mobile-size);height:var(--rc-drag-handle-mobile-size)}}
