:root{--color-primary:#181d26;--color-primary-active:#0d1218;--color-ink:#181d26;--color-body:#333840;--color-muted:#41454d;--color-hairline:#ddd;--color-border-strong:#9297a0;--color-canvas:#fff;--color-surface-soft:#f8fafc;--color-surface-strong:#e0e2e6;--color-surface-dark:#181d26;--color-on-primary:#fff;--color-link:#1b61c9;--color-success:#006400;--color-signature-coral:#aa2d00;--color-signature-forest:#0a2e0e;--color-signature-peach:#fcab79;--color-signature-mint:#a8d8c4;--radius-sm:6px;--radius-md:10px;--radius-lg:14px;--radius-pill:9999px;--font-sans:"IBM Plex Sans", "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px}*,:before,:after{box-sizing:border-box}html,body,#root{min-height:100%}body{font-family:var(--font-sans);color:var(--color-ink);background:var(--color-canvas);margin:0;line-height:1.5}a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit}.app-shell{background:linear-gradient(#f8fafc 0%,#fff 40%);grid-template-columns:220px 1fr;min-height:100vh;display:grid}.sidebar{border-right:1px solid var(--color-hairline);background:var(--color-canvas);padding:var(--space-5) var(--space-4);gap:var(--space-5);flex-direction:column;display:flex}.brand{letter-spacing:-.02em;font-size:1.5rem;font-weight:600}.brand span{color:var(--color-muted);margin-top:4px;font-size:.8rem;font-weight:400;display:block}.nav{gap:var(--space-1);flex-direction:column;display:flex}.nav a{border-radius:var(--radius-md);color:var(--color-body);padding:10px 12px}.nav a.active,.nav a:hover{background:var(--color-surface-soft);color:var(--color-ink)}.main{padding:var(--space-6)}.page-header{margin-bottom:var(--space-5)}.page-header h1{margin:0 0 var(--space-2);letter-spacing:-.02em;font-size:1.75rem;font-weight:500}.page-header p{color:var(--color-muted);margin:0}.panel{border:1px solid var(--color-hairline);border-radius:var(--radius-lg);background:var(--color-canvas);overflow:hidden}.table{border-collapse:collapse;width:100%}.table th,.table td{text-align:left;border-bottom:1px solid var(--color-hairline);padding:12px 16px;font-size:.95rem}.table th{background:var(--color-surface-soft);color:var(--color-muted);font-weight:500}.muted{color:var(--color-muted)}.btn{border-radius:var(--radius-pill);background:var(--color-primary);color:var(--color-on-primary);cursor:pointer;border:none;justify-content:center;align-items:center;gap:8px;padding:10px 18px;display:inline-flex}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-secondary{background:var(--color-canvas);color:var(--color-ink);border:1px solid var(--color-border-strong)}.field{margin-bottom:var(--space-4);flex-direction:column;gap:6px;display:flex}.field input,.field select,.field textarea{border:1px solid var(--color-hairline);border-radius:var(--radius-md);background:var(--color-canvas);padding:10px 12px}.stack{gap:var(--space-4);flex-direction:column;max-width:560px;display:flex}.row{gap:var(--space-3);flex-wrap:wrap;display:flex}.hit-list{margin:0;padding:0;list-style:none}.hit-list li{border-bottom:1px solid var(--color-hairline);padding:14px 16px}.hit-list li:last-child{border-bottom:none}.badge{border-radius:var(--radius-pill);background:var(--color-surface-strong);margin-right:8px;padding:2px 8px;font-size:.75rem;display:inline-block}.status-dot{background:var(--color-border-strong);border-radius:50%;width:8px;height:8px;margin-right:8px;display:inline-block}.status-dot.ok{background:var(--color-success)}.thumb{object-fit:cover;border-radius:var(--radius-md);border:1px solid var(--color-hairline);background:var(--color-surface-soft);width:40px;height:40px;display:block}.thumb-lg{width:160px;height:160px}.thumb-empty{display:inline-block}.thumb-cell{width:56px}.table a{color:var(--color-link);text-decoration:none}.table a:hover{text-decoration:underline}.hit-list a{color:inherit;text-decoration:none}.hit-list a:hover strong{color:var(--color-link)}.btn-danger{background:var(--color-signature-coral);color:var(--color-on-primary)}.btn-sm{padding:6px 12px;font-size:.85rem}.inventory-toolbar{align-items:flex-end;gap:var(--space-3);margin-bottom:var(--space-4);flex-wrap:wrap;display:flex}.inventory-toolbar .field{min-width:140px;margin-bottom:0}.inventory-search{flex:220px;min-width:200px}.table-actions{flex-wrap:wrap;gap:8px;display:flex}.table-actions a.btn{text-decoration:none}.table tr.is-editing td{background:#f3f7fb}.dropzone{border:1.5px dashed var(--color-border-strong);border-radius:var(--radius-lg);background:var(--color-surface-soft);cursor:pointer;text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:10px;min-height:160px;padding:16px;transition:border-color .15s,background .15s;display:flex}.dropzone:hover,.dropzone:focus-visible{border-color:var(--color-ink);outline:none}.dropzone-active{border-color:var(--color-ink);background:var(--color-surface-strong)}.dropzone-disabled{opacity:.55;cursor:not-allowed}.dropzone-hint{flex-direction:column;gap:4px;font-size:.95rem;display:flex}.dropzone-has-file{min-height:220px}.dropzone-preview{object-fit:contain;border-radius:var(--radius-md);border:1px solid var(--color-hairline);background:var(--color-canvas);width:auto;max-width:min(100%,320px);height:auto;max-height:240px}.dropzone-actions{flex-wrap:wrap;margin-top:10px}.dropzone-actions .btn{padding:8px 14px;font-size:.9rem}.image-editor-backdrop{z-index:80;background:#0f172a8c;justify-content:center;align-items:center;padding:16px;display:flex;position:fixed;inset:0}.image-editor{border-radius:var(--radius-lg);background:var(--color-canvas);border:1px solid var(--color-hairline);flex-direction:column;gap:12px;width:min(920px,100%);max-height:min(92vh,900px);padding:16px 16px 14px;display:flex;box-shadow:0 18px 48px #0f172a2e}.image-editor-header h2{margin:0 0 4px;font-size:1.2rem;font-weight:500}.image-editor-header p{margin:0;font-size:.9rem}.image-editor-stage{border-radius:var(--radius-md);touch-action:none;background-color:#f4f7fb;background-image:linear-gradient(45deg,#e8eef5 25%,#0000 25%),linear-gradient(-45deg,#e8eef5 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#e8eef5 75%),linear-gradient(-45deg,#0000 75%,#e8eef5 75%);background-position:0 0,0 10px,10px -10px,-10px 0;background-repeat:repeat,repeat,repeat,repeat;background-size:20px 20px;background-attachment:scroll,scroll,scroll,scroll;background-origin:padding-box,padding-box,padding-box,padding-box;background-clip:border-box,border-box,border-box,border-box;flex:1;justify-content:center;align-items:center;min-height:220px;max-height:min(58vh,520px);padding:12px;display:flex;overflow:auto}.image-editor-frame{max-width:100%;line-height:0;display:inline-block;position:relative}.image-editor-frame img{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;width:auto;max-width:min(100%,840px);height:auto;max-height:min(52vh,480px);display:block}.image-editor-crop{box-sizing:border-box;cursor:move;touch-action:none;border:2px solid #fff;position:absolute;box-shadow:0 0 0 9999px #0f172a73}.image-editor-handle{border:1px solid var(--color-ink);box-sizing:border-box;touch-action:none;background:#fff;border-radius:2px;width:14px;height:14px;position:absolute}.image-editor-handle-nw{cursor:nwse-resize;top:-7px;left:-7px}.image-editor-handle-ne{cursor:nesw-resize;top:-7px;right:-7px}.image-editor-handle-sw{cursor:nesw-resize;bottom:-7px;left:-7px}.image-editor-handle-se{cursor:nwse-resize;bottom:-7px;right:-7px}.image-editor-handle-n{cursor:ns-resize;top:-7px;left:50%;transform:translate(-50%)}.image-editor-handle-s{cursor:ns-resize;bottom:-7px;left:50%;transform:translate(-50%)}.image-editor-handle-w{cursor:ew-resize;top:50%;left:-7px;transform:translateY(-50%)}.image-editor-handle-e{cursor:ew-resize;top:50%;right:-7px;transform:translateY(-50%)}.image-editor-toolbar{flex-wrap:wrap;gap:8px;display:flex}.image-editor-toolbar .btn{padding:8px 12px;font-size:.9rem}.image-editor-error{color:var(--color-signature-coral);margin:0;font-size:.9rem}.image-editor-footer{justify-content:flex-end;gap:10px}@media (width<=720px){.image-editor{max-height:96vh;padding:12px}.image-editor-stage{max-height:46vh}.image-editor-frame img{max-height:40vh}}.recognize-status{border-radius:var(--radius-lg);border:1px solid var(--color-hairline);background:var(--color-surface-soft);align-items:flex-start;gap:14px;max-width:560px;margin-top:16px;padding:14px 16px;display:flex}.recognize-status-active{border-color:var(--color-border-strong)}.recognize-status-done{background:var(--color-canvas)}.recognize-status-error{border-color:var(--color-signature-coral);color:var(--color-signature-coral);flex-direction:column;gap:6px}.recognize-pulse{background:var(--color-ink);border-radius:50%;flex-shrink:0;width:14px;height:14px;margin-top:4px;animation:1.1s ease-in-out infinite recognize-pulse}.recognize-copy{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.recognize-title{letter-spacing:.02em;font-weight:500}.recognize-dots:after{content:"";text-align:left;width:1.2em;animation:1.2s steps(4,end) infinite recognize-dots;display:inline-block}.recognize-meta{color:var(--color-muted);margin:0;padding-left:1.1em;font-size:.92rem}.recognize-raw-toggle{color:var(--color-link);cursor:pointer;background:0 0;border:none;align-self:flex-start;padding:0;font-size:.9rem}.recognize-raw{border-radius:var(--radius-md);background:var(--color-surface-strong);white-space:pre-wrap;word-break:break-word;max-height:180px;margin:0;padding:10px 12px;font-size:.78rem;line-height:1.4;overflow:auto}@keyframes recognize-pulse{0%,to{opacity:.45;transform:scale(.85)}50%{opacity:1;transform:scale(1.15)}}@keyframes recognize-dots{0%{content:""}25%{content:"."}50%{content:".."}75%{content:"..."}}.box-grid-form{margin-top:32px}.box-grid-wrap{border:1px solid var(--color-hairline);border-radius:var(--radius-lg);background:var(--color-canvas);max-width:100%;margin-top:16px;overflow:auto}.box-grid{border-collapse:collapse;min-width:100%;font-size:.85rem}.box-grid th,.box-grid td{border:1px solid var(--color-hairline);vertical-align:top;padding:0}.box-grid thead th,.box-grid tbody th{background:var(--color-surface-soft);color:var(--color-muted);white-space:nowrap;text-align:center;z-index:1;padding:8px 10px;font-weight:500;position:sticky;left:0}.box-grid thead th{z-index:2;position:sticky;top:0}.box-grid-corner{min-width:52px;left:0;z-index:3!important}.box-grid-tile{text-align:left;cursor:pointer;width:100%;min-width:124px;min-height:96px;font:inherit;color:inherit;background:0 0;border:none;flex-direction:column;align-items:flex-start;gap:4px;margin:0;padding:10px;line-height:1.35;transition:background .15s,box-shadow .15s;display:flex}.box-grid-tile:hover{background:#fff}.box-grid-tile.is-filled{background:#eef8f3}.box-grid-tile.is-active{outline:2px solid var(--color-ink);outline-offset:-2px;z-index:1;background:#fff;position:relative}.box-grid-tile-coord{color:var(--color-muted);letter-spacing:.02em;font-size:.72rem}.box-grid-tile-name{-webkit-line-clamp:2;word-break:break-word;-webkit-box-orient:vertical;font-size:.9rem;font-weight:500;display:-webkit-box;overflow:hidden}.box-grid-tile:not(.is-filled) .box-grid-tile-name{color:var(--color-muted);font-weight:400}.box-grid-tile-meta{color:var(--color-muted);-webkit-line-clamp:1;-webkit-box-orient:vertical;font-size:.75rem;display:-webkit-box;overflow:hidden}.box-grid-tile-conf{color:var(--color-muted);margin-top:auto;font-size:.7rem}.box-cell-card{border:1px solid var(--color-hairline);border-radius:var(--radius-lg);background:var(--color-canvas);padding:14px 16px 16px;box-shadow:0 12px 32px #0f172a24,0 2px 8px #0f172a0f}.box-cell-card-header{justify-content:space-between;align-items:flex-start;gap:8px;margin-bottom:12px;display:flex}.box-cell-card-header h3{letter-spacing:-.01em;margin:0;font-size:1rem;font-weight:600}.box-cell-card-close{color:var(--color-muted);cursor:pointer;background:0 0;border:none;padding:0 2px;font-size:1.35rem;line-height:1}.box-cell-card-close:hover{color:var(--color-ink)}.box-cell-card .field{margin-bottom:12px}.box-cell-card-conf{margin:0 0 12px;font-size:.85rem}.box-cell-card-actions{justify-content:flex-end}@media (width<=840px){.app-shell{grid-template-columns:1fr}.sidebar{border-right:none;border-bottom:1px solid var(--color-hairline)}.nav{flex-flow:wrap}}
