:root{--bg: #f3f4f6;--panel: #ffffff;--border: #e5e7eb;--border-strong: #d1d5db;--text: #111827;--muted: #6b7280;--primary: #2563eb;--primary-soft: #dbeafe;--danger: #dc2626;--warn: #b45309;--warn-soft: #fef3c7;--radius: 6px;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;font-size:14px;color:var(--text);background:var(--bg)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{overflow:hidden}button{font:inherit;color:inherit}h1,h2,h3,h4{margin:0}kbd{font-family:ui-monospace,monospace;font-size:12px;background:#f3f4f6;border:1px solid var(--border-strong);border-radius:4px;padding:0 4px}.muted{color:var(--muted)}.small{font-size:12px}.grow{flex:1}.btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--border-strong);background:#fff;border-radius:var(--radius);cursor:pointer;white-space:nowrap;line-height:1.2}.btn:hover:not(:disabled){background:#f9fafb;border-color:#9ca3af}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}.btn.primary:hover:not(:disabled){background:#1d4ed8}.btn.danger{color:var(--danger)}.btn.small{padding:4px 8px;font-size:13px}.btn.full{width:100%;justify-content:center;margin-top:12px}.link-btn{background:none;border:none;color:var(--primary);cursor:pointer;padding:4px 0;font-size:12px;display:inline-flex;align-items:center;gap:4px}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:1px solid transparent;background:transparent;border-radius:var(--radius);cursor:pointer;color:#374151}.icon-btn:hover:not(:disabled){background:#f3f4f6}.icon-btn.active{background:var(--primary-soft);color:var(--primary);border-color:#93c5fd}.icon-btn:disabled{opacity:.35;cursor:not-allowed}.icon-btn.small{width:26px;height:26px}.icon-btn.tiny{width:22px;height:22px;color:var(--muted)}.icon-btn.danger:hover{color:var(--danger)}.input{width:100%;padding:5px 8px;border:1px solid var(--border-strong);border-radius:var(--radius);background:#fff;font:inherit;min-width:0}.input:focus{outline:2px solid #93c5fd;outline-offset:-1px;border-color:var(--primary)}.input.color{padding:2px;height:30px}.field{display:flex;flex-direction:column;gap:3px;margin-bottom:10px;min-width:0}.field-label{font-size:12px;color:var(--muted);font-weight:500}.field-hint{font-size:11px;color:#9ca3af}.check{display:flex;align-items:center;gap:6px;margin:6px 0;font-size:13px;cursor:pointer}.row2{display:grid;grid-template-columns:1fr 1fr;gap:8px}.row3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px}.seg{display:flex}.seg button{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:5px 6px;border:1px solid var(--border-strong);background:#fff;cursor:pointer;font-size:12px}.seg button:first-child{border-radius:var(--radius) 0 0 var(--radius)}.seg button:last-child{border-radius:0 var(--radius) var(--radius) 0;border-left:none}.seg button.active{background:var(--primary-soft);color:var(--primary);border-color:#93c5fd}.editor{display:flex;flex-direction:column;height:100%}.toolbar{display:flex;align-items:center;gap:8px;padding:6px 10px;background:var(--panel);border-bottom:1px solid var(--border);flex-wrap:wrap}.tb-group{display:flex;align-items:center;gap:4px}.tb-group+.tb-group{padding-left:8px;border-left:1px solid var(--border)}.tb-group.tools{gap:2px}.project-name{font-weight:600;font-size:15px;background:none;border:1px solid transparent;border-radius:var(--radius);padding:4px 8px;cursor:pointer;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-name:hover{border-color:var(--border-strong)}.dropdown{position:relative}.dropdown-menu{position:absolute;right:0;top:calc(100% + 4px);background:#fff;border:1px solid var(--border-strong);border-radius:var(--radius);box-shadow:0 8px 24px #0000001f;z-index:50;min-width:240px;padding:4px}.dropdown-menu button,.context-menu button{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:none;background:none;text-align:left;cursor:pointer;border-radius:4px}.dropdown-menu button:hover,.context-menu button:hover{background:#f3f4f6}.context-menu{position:fixed;z-index:100;background:#fff;border:1px solid var(--border-strong);border-radius:var(--radius);box-shadow:0 8px 24px #00000026;padding:4px;min-width:180px}.context-menu button.danger{color:var(--danger)}.sheet-tabs{display:flex;align-items:flex-end;gap:2px;padding:4px 10px 0;background:#e5e7eb;border-bottom:1px solid var(--border-strong);overflow-x:auto}.sheet-tab{display:flex;align-items:center;gap:6px;padding:6px 12px;background:#f3f4f6;border:1px solid var(--border-strong);border-bottom:none;border-radius:6px 6px 0 0;cursor:pointer;white-space:nowrap;user-select:none;font-size:13px}.sheet-tab.active{background:#fff;font-weight:600;margin-bottom:-1px;padding-bottom:7px}.sheet-actions{display:inline-flex;gap:2px}.sheet-actions button{border:none;background:none;cursor:pointer;padding:2px;color:var(--muted);border-radius:3px;display:inline-flex}.sheet-actions button:hover{background:#e5e7eb;color:var(--text)}.sheet-add{display:inline-flex;align-items:center;gap:4px;padding:5px 10px;border:1px dashed #9ca3af;background:none;border-radius:6px 6px 0 0;cursor:pointer;color:var(--muted);font-size:13px;margin-bottom:2px}.sheet-add:hover{color:var(--text);border-color:var(--text)}.workspace{flex:1;display:flex;min-height:0}.panel{background:var(--panel);display:flex;flex-direction:column;min-height:0}.left-panel{width:280px;border-right:1px solid var(--border)}.right-panel{width:290px;border-left:1px solid var(--border)}.panel-body{padding:12px;overflow-y:auto;flex:1}.panel-tabs{display:flex;border-bottom:1px solid var(--border)}.panel-tabs button{flex:1;padding:9px;border:none;background:none;cursor:pointer;color:var(--muted);border-bottom:2px solid transparent;font-weight:500}.panel-tabs button.active{color:var(--primary);border-bottom-color:var(--primary)}.panel-tabs.inline{margin:8px 0}.panel-tabs.inline button{flex:none;padding:8px 14px}.panel-title{font-size:15px;margin-bottom:12px}.panel-sub{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:16px 0 8px}.panel-section-head{display:flex;align-items:center;justify-content:space-between;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:4px 0 6px}.help-line{margin:0 0 8px}.sub-box{border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;margin-top:8px;background:#fafafa}.sub-box .panel-sub{margin-top:0}.drop-box{border-left:3px solid #fb923c;padding-left:8px;margin:6px 0}.file-name{word-break:break-all}.len-box{border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;margin-bottom:12px;background:#f9fafb}.len-box div{display:flex;justify-content:space-between;font-size:13px;padding:1px 0}.len-box span{color:var(--muted)}.len-box .total{border-top:1px solid var(--border);margin-top:4px;padding-top:5px;font-size:14px}.len-box .total span{color:var(--text);font-weight:600}.vertex-list{list-style:none;padding:0;margin:0;max-height:180px;overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius)}.vertex-list li{display:flex;gap:8px;padding:3px 8px;font-size:12px;cursor:pointer;font-variant-numeric:tabular-nums}.vertex-list li:hover{background:#f3f4f6}.vertex-list li.selected{background:var(--primary-soft)}.vx-i{color:var(--muted);width:20px}.vx-c{flex:1}.vx-drop{color:#c2410c;font-weight:600}.tree,.tree-items{list-style:none;margin:0;padding:0}.tree-group{border-radius:var(--radius);margin-bottom:2px}.tree-group.drag-over{outline:2px dashed var(--primary)}.tree-row{display:flex;align-items:center;gap:4px;padding:3px 4px;border-radius:4px;cursor:pointer;min-height:28px}.tree-row:hover{background:#f3f4f6}.group-row.active{background:#eff6ff}.tree-items .tree-row{padding-left:34px}.tree-row.selected{background:var(--primary-soft)}.tree-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.group-row .tree-name{font-weight:600}.tree-meta{font-size:11px;color:var(--muted);white-space:nowrap;font-variant-numeric:tabular-nums}.chev{border:none;background:none;padding:0;display:inline-flex;cursor:pointer;color:var(--muted)}.active-dot{color:transparent;font-size:10px;width:10px}.active-dot.on{color:var(--primary)}.swatch{width:18px;height:18px;padding:0;border:1px solid var(--border-strong);border-radius:4px;cursor:pointer;background:none}.swatch::-webkit-color-swatch-wrapper{padding:0}.swatch::-webkit-color-swatch{border:none;border-radius:3px}.item-icon.shape{width:13px;height:11px;border:2px solid;flex:none;border-radius:2px}.item-icon.shape.ellipse,.item-icon.shape.circle{border-radius:50%}.item-icon.shape.circle{width:12px;height:12px}.item-icon.shape.polygon{clip-path:polygon(50% 0,100% 40%,80% 100%,20% 100%,0 40%);background:currentColor;border:none;color:#6b7280}.item-icon.line{width:14px;height:3px;border-radius:2px;flex:none}.sym-thumb{display:inline-block;flex:none}.sym-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-bottom:12px}.sym-cell{position:relative}.sym-btn{width:100%;display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border:1px solid var(--border);background:#fff;border-radius:var(--radius);cursor:pointer;font-size:11px;text-align:center;min-height:72px}.sym-btn:hover{border-color:#93c5fd;background:#f8fafc}.sym-cell.active .sym-btn{border-color:var(--primary);background:var(--primary-soft)}.sym-del{position:absolute;top:2px;right:2px;border:none;background:#fff;border-radius:3px;cursor:pointer;color:var(--muted);padding:2px;display:none}.sym-cell:hover .sym-del{display:inline-flex}.custom-sym{display:flex;gap:12px}.sym-drop{width:110px;height:110px;border:2px dashed var(--border-strong);border-radius:var(--radius);background:#fafafa;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;cursor:pointer;color:var(--muted);flex:none}.sym-drop img{max-width:90px;max-height:90px}.canvas-area{flex:1;position:relative;min-width:0;background:#e5e7eb}.canvas-wrap{position:absolute;inset:0;overflow:hidden;background:#eef0f3}.canvas-wrap.custom-bg:after{content:"";position:absolute;inset:0;pointer-events:none;z-index:4;box-shadow:inset 0 0 0 2px #11182773,inset 0 0 12px #00000040}.plain-fieldset{border:0;margin:0;padding:0;min-width:0}.plain-fieldset:disabled{opacity:.75}.canvas-color{display:flex;align-items:center;gap:8px}.readout{position:absolute;pointer-events:none;background:#111827e0;color:#fff;padding:4px 8px;border-radius:4px;font-size:12px;white-space:nowrap;font-variant-numeric:tabular-nums;z-index:5}.snap-kind{margin-left:8px;padding:0 5px;background:#fff3;border-radius:3px;font-size:11px}.banner{position:absolute;top:10px;left:50%;transform:translate(-50%);padding:6px 14px;border-radius:var(--radius);font-size:13px;z-index:4;box-shadow:0 2px 8px #00000014}.banner.warn{background:var(--warn-soft);color:#78350f;border:1px solid #fcd34d}.tool-hint{position:absolute;bottom:10px;left:50%;transform:translate(-50%);background:#fffffff2;border:1px solid var(--border);padding:5px 12px;border-radius:20px;font-size:12px;color:#374151;pointer-events:none;white-space:nowrap;max-width:calc(100% - 20px);overflow:hidden;text-overflow:ellipsis;z-index:4}.empty-hint{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none}.empty-card{pointer-events:auto;background:#fff;border:1px solid var(--border);border-radius:10px;padding:24px 28px;max-width:380px;text-align:center;box-shadow:0 4px 20px #0000000f}.empty-card h3{margin-bottom:8px}.empty-card p{margin:8px 0 14px}.calib-panel{position:absolute;top:12px;right:12px;width:360px;background:#fff;border:1px solid var(--border-strong);border-radius:8px;box-shadow:0 8px 28px #00000026;padding:12px 14px;z-index:10;max-height:calc(100% - 24px);overflow-y:auto}.calib-head{display:flex;justify-content:space-between;align-items:center}.calib-head h3{display:flex;align-items:center;gap:6px;font-size:15px}.calib-point{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:6px;border-radius:var(--radius);margin-bottom:4px;border:1px solid var(--border)}.calib-point.picking{border-color:var(--danger);background:#fef2f2}.calib-name{font-weight:700;color:#b91c1c;width:16px}.calib-xy{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--muted);flex:1}.calib-xy .input{width:64px;padding:4px 6px}.calib-px{order:10;flex-basis:100%;padding-left:22px}.calib-px-label{min-width:92px}.calib-point .btn{min-width:92px;justify-content:center}.calib-result{background:#f0fdf4;border:1px solid #bbf7d0;border-radius:var(--radius);padding:6px 8px;margin:6px 0;line-height:1.6}.calib-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.note{padding:6px 8px;border-radius:var(--radius);font-size:12px;margin:6px 0;display:flex;gap:6px;align-items:flex-start}.note.warn{background:var(--warn-soft);color:#78350f}.note.error{background:#fef2f2;color:#991b1b}.warn-text{color:var(--warn)}.statusbar{display:flex;align-items:center;gap:16px;padding:4px 12px;background:var(--panel);border-top:1px solid var(--border);font-size:12px;white-space:nowrap;overflow-x:auto}.sb-coords{font-variant-numeric:tabular-nums;min-width:170px;font-family:ui-monospace,monospace}.sb-snaps{display:flex;align-items:center;gap:4px;color:var(--muted)}.chip{border:1px solid var(--border-strong);background:#fff;border-radius:10px;padding:1px 8px;font-size:11px;cursor:pointer;color:var(--muted)}.chip.on{background:var(--primary-soft);border-color:#93c5fd;color:var(--primary)}.sb-spacer{flex:1}.sb-error{color:var(--danger);font-weight:600}.sb-total b{font-variant-numeric:tabular-nums}.modal-backdrop{position:fixed;inset:0;background:#11182766;display:flex;align-items:center;justify-content:center;z-index:200;padding:16px}.modal{background:#fff;border-radius:10px;box-shadow:0 20px 50px #00000040;max-width:100%;max-height:calc(100vh - 32px);display:flex;flex-direction:column}.modal-head{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid var(--border)}.modal-head h2{font-size:16px}.modal-body{padding:16px;overflow-y:auto}.modal-body p:first-child{margin-top:0}.modal-foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 16px;border-top:1px solid var(--border);flex-wrap:wrap}.total-banner{background:#f0f9ff;border:1px solid #bae6fd;padding:10px 12px;border-radius:var(--radius);font-size:15px}.total-banner .muted{font-size:12px}.table-wrap{max-height:50vh;overflow:auto;border:1px solid var(--border);border-radius:var(--radius)}.table{width:100%;border-collapse:collapse;font-size:13px}.table th,.table td{padding:6px 10px;border-bottom:1px solid var(--border);text-align:left}.table th{background:#f9fafb;position:sticky;top:0;font-weight:600;font-size:12px;color:#374151}.table .num{text-align:right;font-variant-numeric:tabular-nums}.table .b{font-weight:600}.table tr.sum td{font-weight:600;background:#fafafa}.table tr.sub td{color:#4b5563}.table.compact td{padding:4px 8px}.dot{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:4px;vertical-align:middle}.terms{padding-left:18px;margin:0;line-height:1.5}.about-h{font-size:14px;margin:16px 0 6px}.note.ai-note{background:#eff6ff;color:#1e3a8a}.help-steps{padding-left:20px;line-height:1.6;margin-top:0}.toast{position:fixed;bottom:44px;left:50%;transform:translate(-50%);background:#111827;color:#fff;padding:10px 16px;border-radius:8px;box-shadow:0 8px 24px #00000040;z-index:300;max-width:560px;cursor:pointer;font-size:13px}.toast.error{background:#991b1b}.project-list-page{height:100%;overflow-y:auto;display:flex;justify-content:center;padding:48px 16px}.pl-card{width:100%;max-width:760px}.pl-head{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:20px;flex-wrap:wrap}.pl-head h1{font-size:28px}.pl-head p{margin:6px 0 0}.pl-actions{display:flex;gap:8px}.pl-list{list-style:none;padding:0;margin:0;background:#fff;border:1px solid var(--border);border-radius:10px;overflow:hidden}.pl-item{display:flex;align-items:center;border-bottom:1px solid var(--border)}.pl-item:last-child{border-bottom:none}.pl-open{flex:1;display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:14px 16px;border:none;background:none;cursor:pointer;text-align:left}.pl-open:hover{background:#f9fafb}.pl-name{font-weight:600;font-size:15px}.pl-item-actions{display:flex;gap:2px;padding-right:10px}.pl-empty{background:#fff;border:1px dashed var(--border-strong);border-radius:10px;padding:40px;text-align:center}.pl-foot{margin-top:16px}@media(max-width:1100px){.left-panel{width:230px}.right-panel{width:250px}}.consent-backdrop{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:16px;background:linear-gradient(135deg,#e0e7ff,#f3f4f6 60%)}.consent{background:#fff;border-radius:12px;box-shadow:0 20px 50px #00000026;padding:24px 28px;max-width:480px;width:100%}.consent h2{font-size:20px;margin-bottom:12px}.consent p{line-height:1.5;margin:0 0 12px}.consent-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:18px}.rejected-screen{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:24px;background:linear-gradient(135deg,#e5e7eb,#f9fafb);text-align:center}.rejected-text{font-size:20px;color:#374151;max-width:620px;line-height:1.5;margin:0}.rejected-link{font-size:13px;color:var(--muted)}.lang-select{display:inline-flex;align-items:center;gap:4px;color:var(--muted)}.lang-select .input{width:auto;padding:3px 6px}.consent-lang{display:flex;justify-content:flex-end;margin-bottom:8px}
