:root{--bg: #0b1119;--card: #121a26;--card-raised: #172130;--inset: #0a0f17;--line: #24324a;--line-soft: #1b2536;--muted: #8595ad;--txt: #e7edf6;--accent: #5695f0;--accent-soft: rgba(86, 149, 240, .14);--ok: #2ebd7c;--ok-soft: rgba(46, 189, 124, .12);--warn: #e0a63c;--warn-soft: rgba(224, 166, 60, .12);--bad: #e5484d;--bad-soft: rgba(229, 72, 77, .14);--font-sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono: ui-monospace, "SF Mono", "Cascadia Mono", "Roboto Mono", Consolas, monospace;--r-sm: 8px;--r-md: 12px;--r-lg: 16px;--shadow-card: 0 1px 0 rgba(255, 255, 255, .03) inset, 0 8px 24px rgba(3, 8, 16, .35);--shadow-pop: 0 18px 50px rgba(3, 8, 16, .6)}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;font-family:var(--font-sans);background:var(--bg);background-image:radial-gradient(900px 420px at 50% -140px,rgba(86,149,240,.09),transparent 70%);background-repeat:no-repeat;color:var(--txt);font-size:15px;line-height:1.5;-webkit-font-smoothing:antialiased}header{background:#121a26eb;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);padding:10px 14px;padding-top:max(10px,env(safe-area-inset-top));border-bottom:1px solid var(--line-soft);position:sticky;top:0;z-index:20}header h1{margin:0;font-size:15px;font-weight:700;letter-spacing:-.01em;text-wrap:balance}header p{margin:2px 0 0;color:var(--muted);font-size:12px;display:none}.wrap{max-width:1100px;margin:0 auto;padding:12px;padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right));padding-bottom:max(24px,env(safe-area-inset-bottom))}.card{background:var(--card);border:1px solid var(--line-soft);border-radius:var(--r-lg);padding:14px;margin-bottom:12px;box-shadow:var(--shadow-card)}.card h2{margin:0 0 12px;font-size:14px;font-weight:650;letter-spacing:-.005em;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.card h2 .muted{font-weight:500}.step{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;flex:none;border-radius:7px;background:var(--accent-soft);color:var(--accent);font-size:12px;font-weight:700;font-variant-numeric:tabular-nums}.tabs{display:flex;gap:4px;margin-bottom:12px;background:var(--inset);border:1px solid var(--line-soft);border-radius:var(--r-md);padding:4px}.tab{flex:1;background:transparent;border:none;color:var(--muted);font-weight:600;font-size:13px;padding:10px 8px;border-radius:9px;min-height:42px;transition:background .18s ease,color .18s ease}.tab:hover{background:#ffffff0a;color:var(--txt)}.tab.active{background:var(--accent);color:#fff}.tab.active:hover{background:var(--accent)}.row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.note{flex:1 1 100%}input[type=text],.ta,.pagesel{background:var(--inset);border:1px solid var(--line);color:var(--txt);border-radius:var(--r-sm);font-size:16px;transition:border-color .15s ease,box-shadow .15s ease}input[type=text]{padding:11px 12px;flex:1 1 100%;min-width:0;min-height:44px}.ta{width:100%;padding:11px 12px;font-family:var(--font-mono);resize:vertical}input[type=text]:focus,.ta:focus,.pagesel:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}input::placeholder,.ta::placeholder{color:#5c6b83}button{background:var(--accent);color:#fff;border:none;padding:11px 14px;border-radius:10px;font-size:14px;font-family:inherit;cursor:pointer;font-weight:600;white-space:nowrap;min-height:44px;transition:background .15s ease,border-color .15s ease,transform .1s ease,opacity .15s ease}button:hover{background:#6ba3f4}button:active:not(:disabled){transform:translateY(1px) scale(.99)}button:focus-visible,.tab:focus-visible{outline:2px solid var(--accent);outline-offset:2px}button.ghost{background:transparent;border:1px solid var(--line);color:var(--txt)}button.ghost:hover{background:#ffffff0d;border-color:#33445f}button.ok{background:var(--ok)}button.ok:hover{background:#38d18c}button.warn{background:var(--warn);color:#201607}button.warn:hover{background:#ecb653}button.bad{background:var(--bad)}button.bad:hover{background:#ef5a5f}button.bad.ghost{background:transparent;border-color:#e5484d80;color:#f08488}button.bad.ghost:hover{background:var(--bad-soft)}button:disabled{opacity:.45;cursor:not-allowed}.row>button{flex:1 1 auto}input[type=range]{accent-color:var(--accent);height:32px}input[type=checkbox]{accent-color:var(--accent);width:18px;height:18px}.muted{color:var(--muted);font-size:13px}.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.big{font-size:20px;font-weight:700;font-family:var(--font-mono);letter-spacing:.4px;word-break:break-all}.hidden{display:none!important}code{background:var(--inset);border:1px solid var(--line-soft);padding:2px 6px;border-radius:5px;font-size:12px;font-family:var(--font-mono)}.filebtn{position:relative;overflow:hidden}.filebtn input{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;cursor:pointer}.progress-head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:8px}.progress-count{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:26px;font-weight:700;line-height:1;letter-spacing:-.02em}.progress-count.done{color:var(--ok)}.progress-count .of{color:var(--muted);font-size:15px;font-weight:500}.progress-pct{margin-left:auto;font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:13px;color:var(--muted)}.progressbar{height:6px;border-radius:999px;background:var(--inset);border:1px solid var(--line-soft);overflow:hidden;margin-bottom:12px}.progressbar>span{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,var(--accent),#7db2f7);transition:width .4s ease}.progressbar.full>span{background:var(--ok)}.stats{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}.stat{background:var(--inset);border:1px solid var(--line-soft);border-radius:var(--r-md);padding:10px 12px;text-align:left}.stat span{display:block;color:var(--muted);font-size:11px;font-weight:600;margin-bottom:4px}.stat b{display:block;font-size:20px;line-height:1.1;font-family:var(--font-mono);font-variant-numeric:tabular-nums;letter-spacing:-.01em}.stat small{display:block;margin-top:2px;font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums}.stat small.warn{color:var(--warn)}.stat small.ok{color:var(--ok)}.dup-alert,.ok-line{margin-top:10px;padding:9px 12px;border-radius:var(--r-sm);font-size:13px;font-weight:600;font-variant-numeric:tabular-nums}.dup-alert{background:var(--bad-soft);border:1px solid rgba(229,72,77,.4);color:#f5a3a6}.ok-line{background:var(--ok-soft);border:1px solid rgba(46,189,124,.3);color:#7fd8ae}.tag{display:inline-block;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:600;white-space:nowrap}.tag.done{background:var(--ok-soft);color:#6fd6a6}.tag.todo{background:var(--warn-soft);color:#eec06a}.tag.new{background:var(--accent-soft);color:#8cb6f5}.tag.dup{background:var(--bad-soft);color:#f39498}.tag.tem{background:#a78bfa29;color:#c4b5fd}.statuscell{display:flex;flex-wrap:wrap;gap:4px;align-items:center}.suggest{margin-top:10px;border:1px solid var(--line-soft);border-radius:var(--r-md);background:var(--inset);max-height:280px;overflow:auto}.suggest>div{padding:12px;min-height:44px;border-bottom:1px solid var(--line-soft);cursor:pointer;font-family:var(--font-mono);font-size:14px;display:flex;justify-content:space-between;align-items:center;gap:10px;transition:background .12s ease}.suggest>div:last-child{border-bottom:none}.suggest>div:hover,.suggest>div:active{background:var(--card-raised)}.suggest .s-mac{color:var(--muted);font-size:12px;font-family:var(--font-sans)}.chips{display:flex;gap:6px;margin-top:8px;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;margin-left:-14px;margin-right:-14px;padding-left:14px;padding-right:14px}.chips::-webkit-scrollbar{display:none}.chip{position:relative;display:inline-flex;flex:none}.chip input{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;margin:0;cursor:pointer}.chip span{display:inline-flex;align-items:center;white-space:nowrap;min-height:34px;padding:5px 12px;border-radius:999px;border:1px solid var(--line);background:transparent;color:var(--muted);font-size:12.5px;font-weight:600;transition:background .15s ease,border-color .15s ease,color .15s ease}.chip input:checked+span{background:var(--accent-soft);border-color:var(--accent);color:#a9c9f8}.chip input:focus-visible+span{outline:2px solid var(--accent);outline-offset:2px}.tablebox{border:1px solid var(--line-soft);border-radius:var(--r-md)}table{width:100%;border-collapse:collapse;font-size:13px}th,td{padding:8px 10px;border-bottom:1px solid var(--line-soft);text-align:left}th{position:sticky;top:0;z-index:1;background:var(--card-raised);color:var(--muted);font-weight:600;font-size:12px;white-space:nowrap}td{font-variant-numeric:tabular-nums}.cellinput{background:var(--inset);border:1px solid var(--line);color:var(--txt);padding:8px 9px;border-radius:7px;width:100%;min-height:38px;font-size:16px;font-family:var(--font-mono);transition:border-color .15s ease,box-shadow .15s ease}.cellinput:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.cellinput.dup{border-color:var(--bad);background:#251014;color:#fecaca}.delbtn{background:transparent;border:1px solid var(--line);color:#f08488;padding:8px 10px;min-height:38px;font-size:15px;line-height:1}.delbtn:hover{background:var(--bad-soft);border-color:var(--bad)}@media (max-width: 719.98px){.tablebox{border:none;border-radius:0}.data-table,.data-table tbody,.data-table tr,.data-table td{display:block}.data-table thead{display:none}.data-table tr{position:relative;display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:var(--inset);border:1px solid var(--line-soft);border-radius:var(--r-md);padding:12px 52px 12px 12px;margin-bottom:8px}.data-table td{border:none;padding:0}.data-table .c-stt{position:absolute;top:12px;right:12px;color:var(--muted);font-size:11px;font-family:var(--font-mono)}.data-table .c-stt:before{content:"#"}.data-table .c-serial{order:1;flex:0 1 auto;min-width:0;font-family:var(--font-mono);font-weight:700;font-size:15px;word-break:break-all}.data-table .c-status{order:2;flex:1 1 auto}.data-table .c-mac,.data-table .c-tem,.data-table .c-bvan,.data-table .c-sim{flex:1 1 100%;display:grid;grid-template-columns:52px 1fr;align-items:center;gap:8px}.data-table .c-mac{order:3}.data-table .c-tem{order:4}.data-table .c-bvan{order:5}.data-table .c-sim{order:6}.data-table .c-mac:before,.data-table .c-tem:before,.data-table .c-bvan:before,.data-table .c-sim:before{content:attr(data-label);color:var(--muted);font-size:11px;font-weight:600}.data-table .c-del{position:absolute;top:34px;right:8px}.data-table .c-del .delbtn{border:none;padding:8px;min-height:40px}}.pager{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:8px;margin-top:10px;font-variant-numeric:tabular-nums}.pager-nav{display:flex;align-items:center;gap:6px}.pager-nav button{padding:8px 12px;min-width:44px}.pagesel{padding:8px 9px;min-height:40px}.current{border:1px solid var(--accent);background:var(--inset);box-shadow:0 0 0 3px var(--accent-soft)}.editor-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:12px}.editor-head .muted{font-size:12px}.editor-head button{min-height:38px;padding:8px 12px;flex:none}.field{margin-top:10px}.field-label{display:block;color:var(--muted);font-size:12px;font-weight:600;margin-bottom:5px}.editor-actions{margin-top:14px;padding-top:12px;border-top:1px solid var(--line-soft)}.dupwarn{margin-top:8px;padding:9px 12px;border-radius:var(--r-sm);background:var(--bad-soft);border:1px solid rgba(229,72,77,.45);color:#f5b2b5;font-size:13px;font-weight:600}.modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#04080ec7;z-index:50;display:flex;align-items:flex-end;justify-content:center;padding:0}.modal .box{background:var(--card);border:1px solid var(--line-soft);border-bottom:none;border-radius:var(--r-lg) var(--r-lg) 0 0;padding:14px;padding-bottom:calc(14px + env(safe-area-inset-bottom));width:100%;max-width:460px;max-height:92vh;max-height:94dvh;overflow-y:auto;box-shadow:var(--shadow-pop);animation:sheetup .22s ease-out}@keyframes sheetup{0%{transform:translateY(24px);opacity:.6}to{transform:none;opacity:1}}.scanview{position:relative;width:100%;aspect-ratio:1 / 1;background:#000;border-radius:var(--r-md);overflow:hidden}.scanview video{width:100%;height:100%;display:block;object-fit:cover}#reader{width:100%;aspect-ratio:1 / 1;border-radius:var(--r-md);overflow:hidden;background:#000;position:relative}#reader video{width:100%!important;height:100%!important;object-fit:cover;display:block}#reader canvas{display:none}.focusing{position:absolute;left:50%;top:12px;transform:translate(-50%);background:#000000a6;color:#fff;padding:5px 12px;border-radius:999px;font-size:13px;font-weight:600;pointer-events:none}.scanframe{position:absolute;left:6%;right:6%;top:30%;height:40%;border:2px solid var(--accent);border-radius:var(--r-md);box-shadow:0 0 0 9999px #00000047;pointer-events:none}.cropStage{position:relative;max-height:60vh;max-height:60dvh;overflow:hidden;border-radius:var(--r-md);touch-action:none;-webkit-user-select:none;user-select:none}.cropSel{position:absolute;border:2px solid var(--ok);background:#2ebd7c1a;box-shadow:0 0 0 9999px #00000080;cursor:move}.cropSel .handle{position:absolute;width:28px;height:28px;margin:-15px;background:var(--ok);border:2px solid #fff;border-radius:50%;box-shadow:0 1px 5px #000000b3;touch-action:none}.cropSel .handle[data-corner=nw]{left:0;top:0;cursor:nwse-resize}.cropSel .handle[data-corner=ne]{right:0;top:0;cursor:nesw-resize}.cropSel .handle[data-corner=sw]{left:0;bottom:0;cursor:nesw-resize}.cropSel .handle[data-corner=se]{right:0;bottom:0;cursor:nwse-resize}.toast-wrap{position:fixed;bottom:calc(16px + env(safe-area-inset-bottom));left:50%;transform:translate(-50%);z-index:60;display:flex;flex-direction:column;gap:8px;align-items:center;width:max-content;max-width:94vw}.toast{background:var(--card-raised);border:1px solid var(--line);padding:12px 16px;border-radius:var(--r-md);box-shadow:var(--shadow-pop);font-weight:600;font-size:14px;max-width:94vw}.toast.ok{border-color:#2ebd7c99}.toast.bad{border-color:#e5484d99}.toast.warn{border-color:#e0a63c99}.toast.big{font-size:17px;font-weight:700;padding:15px 22px;border-width:2px;text-align:center;white-space:pre-line;animation:toastpop .18s ease-out}.toast.big.ok{background:#0c2418;color:#b7f2d3}.toast.big.warn{background:#271e09;color:#fbe1a0}.toast.big.bad{background:#271014;color:#fbc7ca}@keyframes toastpop{0%{transform:translateY(10px) scale(.94);opacity:0}to{transform:none;opacity:1}}.hwbar.hw-on{border-color:var(--ok);box-shadow:inset 0 0 0 1px #2ebd7c40}.hw-status{margin-top:10px;padding:9px 12px;border-radius:var(--r-sm);background:var(--ok-soft);border:1px solid rgba(46,189,124,.35);font-size:14px}.hw-suggest{margin-top:10px;padding:10px 12px;border-radius:var(--r-sm);background:var(--accent-soft);border:1px solid var(--accent);display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between;font-size:14px}.hw-settings{margin-top:12px;border-top:1px solid var(--line-soft);padding-top:12px}.hw-settings .pagesel{font-size:14px}.hw-sim{margin-top:12px;border-top:1px dashed var(--line);padding-top:10px}.hw-wait{text-align:center;padding:22px 12px 8px;border-radius:var(--r-md);background:var(--ok-soft);border:1px solid rgba(46,189,124,.35)}.hw-wait-pulse{font-size:46px;line-height:1;animation:hwPulse 1.2s ease-in-out infinite}.hw-wait-title{font-size:17px;margin:14px 0 0}@keyframes hwPulse{0%,to{transform:scale(1);opacity:.85}50%{transform:scale(1.18);opacity:1}}@media (min-width: 720px){body{font-size:15px}header{padding:14px 20px}header h1{font-size:18px;letter-spacing:-.015em}header p{display:block;font-size:13px;max-width:65ch}.wrap,.card{padding:18px}.card h2{font-size:15px}.tab{font-size:14px}.chips{flex-wrap:wrap;overflow:visible;margin-left:0;margin-right:0;padding-left:0;padding-right:0}.row>button{flex:0 0 auto}input[type=text]{flex:1;min-width:200px}.stats{grid-template-columns:repeat(4,1fr);gap:10px}.progress-count{font-size:30px}.tablebox{max-height:65vh;overflow:auto}.data-table{min-width:860px}tbody tr{transition:background .12s ease}tbody tr:hover{background:var(--inset)}.cellinput{font-size:13px;min-height:34px;padding:6px 8px}.pager{justify-content:space-between}.modal{align-items:center;padding:16px}.modal .box{border-radius:var(--r-lg);border-bottom:1px solid var(--line-soft);max-width:440px;max-height:92vh;animation:toastpop .18s ease-out}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}html{scroll-behavior:auto}}
