:root{--text:#1f2330;--muted:#6b6f7b;--bg:#f4f5f7;--panel:#fff;--border:#d9dce3;--accent:#2f6fed;--accent-bg:#2f6fed1a;--danger:#c62828;--ok:#2e7d32;color:var(--text);background:var(--bg);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;font:14px/1.4 system-ui,Segoe UI,Roboto,Noto Sans TC,sans-serif}*{box-sizing:border-box}body{margin:0}#root{height:100vh}button,select,input{font:inherit}.app{flex-direction:column;height:100vh;display:flex}.toolbar{background:var(--panel);border-bottom:1px solid var(--border);flex-wrap:wrap;align-items:center;gap:16px;padding:8px 12px;display:flex}.toolbar .brand{font-size:15px}.toolbar .group{align-items:center;gap:4px;display:flex}.toolbar .status{border-radius:10px;margin-left:auto;padding:2px 8px;font-size:12px}.status.ok{color:var(--ok);background:#2e7d321a}.status.bad{color:var(--danger);background:#c628281a}button{border:1px solid var(--border);cursor:pointer;background:#fff;border-radius:4px;padding:4px 10px}button:hover:not(:disabled){border-color:var(--accent)}button:disabled{opacity:.5;cursor:default}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}button.danger{color:var(--danger)}.load-errors{border:1px solid var(--danger);color:var(--danger);background:#fff5f5;border-radius:4px;max-height:30vh;margin:8px 12px 0;padding:8px 12px;overflow:auto}.load-errors-head{justify-content:space-between;align-items:center;display:flex}.load-errors ul,.issues ul{margin:6px 0 0;padding-left:18px;font-size:12px}.workspace{flex:1;grid-template-columns:190px 1fr 320px;min-height:0;display:grid}.palette,.side{background:var(--panel);padding:10px;overflow:auto}.palette{border-right:1px solid var(--border)}.side{border-left:1px solid var(--border)}h2{margin:0 0 6px;font-size:14px}h3{margin:12px 0 4px;font-size:13px}.hint{color:var(--muted);margin:0 0 8px;font-size:12px}.palette-item{border:1px solid var(--border);cursor:grab;-webkit-user-select:none;user-select:none;background:#fafbfc;border-radius:4px;flex-direction:column;margin-bottom:6px;padding:6px 8px;display:flex}.palette-item:hover{border-color:var(--accent);background:var(--accent-bg)}.palette-item small{color:var(--muted)}.canvas-host{min-width:0;display:flex;overflow:hidden}.canvas-scroll{flex:1;align-items:flex-start;padding:32px;display:flex;overflow:auto}.page{color:#222;background:#fff;flex:none;margin:0 auto;position:relative;box-shadow:0 1px 4px #00000040}.page-margins{pointer-events:none;border:1px dashed #2f6fed59;position:absolute}.reg-mark{pointer-events:none;background:#000;position:absolute}.field{cursor:move;touch-action:none;-webkit-user-select:none;user-select:none;outline:1px dotted #00000026;position:absolute}.field:hover{outline-color:var(--accent)}.field.selected{outline:1.5px solid var(--accent);background:var(--accent-bg);z-index:1}.field-svg{pointer-events:none;display:block;overflow:visible}.field-tag{white-space:nowrap;color:var(--muted);pointer-events:none;font-size:10px;line-height:1.2;position:absolute;bottom:100%;left:0}.field.selected .field-tag{color:var(--accent)}.handle{border:1.5px solid var(--accent);background:#fff;border-radius:1px;width:8px;height:8px;margin:-4px 0 0 -4px;position:absolute}.handle-nw{cursor:nwse-resize;top:0;left:0}.handle-n{cursor:ns-resize;top:0;left:50%}.handle-ne{cursor:nesw-resize;top:0;left:100%}.handle-e{cursor:ew-resize;top:50%;left:100%}.handle-se{cursor:nwse-resize;top:100%;left:100%}.handle-s{cursor:ns-resize;top:100%;left:50%}.handle-sw{cursor:nesw-resize;top:100%;left:0}.handle-w{cursor:ew-resize;top:50%;left:0}.props-header{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}fieldset{border:1px solid var(--border);border-radius:4px;margin:0 0 10px;padding:6px 8px 8px}legend{color:var(--muted);padding:0 4px;font-size:12px;font-weight:600}.row{flex-direction:column;gap:2px;margin-bottom:6px;font-size:12px;display:flex}.row-label{color:var(--muted)}.row-input{flex-direction:column;display:flex}.row-input input[type=text],.row-input input[type=number],.row-input select{border:1px solid var(--border);border-radius:3px;width:100%;padding:3px 6px}.row-input input[type=checkbox]{align-self:flex-start}.row-hint{color:var(--muted);font-size:11px}.error{color:var(--danger)}.grid2{grid-template-columns:1fr 1fr;column-gap:8px;display:grid}.options{font-size:12px}.options-head,.option-row{grid-template-columns:1fr 1fr 28px;gap:4px;margin-bottom:4px;display:grid}.options-head{color:var(--muted)}.option-row input{border:1px solid var(--border);border-radius:3px;min-width:0;padding:3px 6px}.option-row input.invalid{border-color:var(--danger)}.option-row button{padding:0}.issues{color:var(--danger)}.toolbar .mode-toggle button.active{background:var(--accent-bg);border-color:var(--accent);color:var(--accent);font-weight:600}.review{flex:1;grid-template-columns:320px 1fr;min-height:0;display:grid}.review-setup{background:var(--panel);border-right:1px solid var(--border);padding:10px;overflow:auto}.review-setup h2{margin-top:14px}.review-setup h2:first-child{margin-top:0}.review-setup .row input[type=text],.review-setup .row select{border:1px solid var(--border);border-radius:3px;padding:3px 6px}.review-actions{flex-wrap:wrap;align-items:center;gap:4px;margin-bottom:8px;display:flex}.review-actions input[type=text]{border:1px solid var(--border);border-radius:3px;flex:1;min-width:0;padding:3px 6px}.review-job{min-width:0;padding:12px 16px;overflow:auto}.review-job .load-errors{margin:0 0 10px}.review-job-head{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:4px;display:flex}.review-job-head h2{margin:0}.review-job-head .review-actions{margin:0 0 0 auto}.review-export .hint,.review-webhook .hint{margin:0}.review-webhook .webhook-ok{color:var(--ok)}.review-webhook .webhook-failed{color:var(--danger)}.review-batch-export textarea{box-sizing:border-box;border:1px solid var(--border);resize:vertical;border-radius:3px;width:100%;margin-bottom:4px;padding:3px 6px;font-family:monospace;font-size:12px}a.button-link{border:1px solid var(--border);color:inherit;background:#fff;border-radius:4px;padding:4px 10px;text-decoration:none}a.button-link:hover{border-color:var(--accent)}.job-status{color:var(--muted);background:#0000000f;border-radius:10px;padding:2px 8px;font-size:12px}.job-status-recognized,.job-status-in_review{color:var(--accent);background:var(--accent-bg)}.job-status-done{color:var(--ok);background:#2e7d321a}.job-status-failed{color:var(--danger);background:#c628281a}.review-fields{border-collapse:collapse;background:#fff;width:100%;font-size:12px}.review-fields th,.review-fields td{border-bottom:1px solid var(--border);text-align:left;vertical-align:middle;padding:4px 8px}.review-fields th{color:var(--muted);font-weight:600}.review-fields input[type=text]{border:1px solid var(--border);border-radius:3px;width:100%;min-width:120px;padding:3px 6px}.review-fields input.dirty{border-color:var(--accent)}.review-fields tr.low-confidence td{background:#fff4e0}.review-fields tr.low-confidence td:first-child{box-shadow:inset 3px 0 #e69500}.review-notes{color:var(--muted)}.review-notes span+span{margin-left:6px}
