:root{--bg:#0f172a;--panel:#1e293b;--panel-2:#273449;--line:#334155;--text:#e2e8f0;--muted:#94a3b8;--accent:#2563eb;--accent-hover:#1d4ed8;--danger:#dc2626;--radius:10px;--shadow:0 10px 30px #00000059}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.app{flex-direction:column;height:100vh;display:flex}.topbar-right{align-items:center;gap:18px;display:flex}.contact{color:var(--text);border:1px solid var(--line);background:var(--panel-2);white-space:nowrap;border-radius:8px;align-items:center;gap:6px;padding:7px 12px;font-size:13px;font-weight:600;text-decoration:none;display:inline-flex}.contact:hover{border-color:var(--accent,#3b82f6);color:#fff}.topbar{border-bottom:1px solid var(--line);background:linear-gradient(#1e293b,#172033);justify-content:space-between;align-items:center;padding:14px 22px;display:flex}.brand{align-items:center;gap:14px;display:flex}.logo{color:var(--accent);font-size:30px;line-height:1}.brand h1{margin:0;font-size:18px}.brand p{color:var(--muted);margin:2px 0 0;font-size:12px}.tabs{gap:8px;display:flex}.tab{border:1px solid var(--line);color:var(--muted);cursor:pointer;background:0 0;border-radius:999px;align-items:center;gap:8px;padding:9px 16px;font-size:14px;font-weight:600;transition:all .15s;display:flex}.tab:hover{color:var(--text);border-color:#475569}.tab.active{background:var(--accent);border-color:var(--accent);color:#fff}.badge{text-align:center;background:#ffffff2e;border-radius:999px;min-width:20px;padding:1px 8px;font-size:11px}.tab:not(.active) .badge{background:var(--panel-2)}.badge.wip{color:#1a1206;text-transform:uppercase;letter-spacing:.3px;background:#f59e0b;font-weight:700}.tab:not(.active) .badge.wip{background:#f59e0b}.content{flex:1;min-height:0;overflow:hidden}.btn{background:var(--panel-2);color:var(--text);border:1px solid var(--line);cursor:pointer;border-radius:8px;padding:9px 14px;font-size:13px;font-weight:600;transition:all .15s}.btn:hover:not(:disabled){border-color:#64748b;transform:translateY(-1px)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover:not(:disabled){background:var(--accent-hover)}.btn.danger{color:#fca5a5;border-color:#7f1d1d}.btn.danger:not(.ghost){background:var(--danger);color:#fff;border-color:var(--danger)}.btn.ghost{background:0 0}.btn.full{width:100%;display:block}.btn-row{gap:8px;display:flex}.btn-row .btn{flex:1}.link-btn{color:var(--accent);cursor:pointer;font:inherit;background:0 0;border:none;padding:0;text-decoration:underline}.icon-btn{color:var(--muted);cursor:pointer;background:0 0;border:none;border-radius:5px;padding:2px 5px;font-size:16px;line-height:1}.icon-btn:hover{color:#fca5a5;background:#dc26261f}.data-tab{flex-direction:column;gap:16px;height:100%;padding:22px;display:flex;overflow:auto}.dropzone{border:2px dashed var(--line);border-radius:var(--radius);cursor:pointer;background:var(--panel);align-items:center;gap:18px;padding:28px;transition:all .15s;display:flex}.dropzone:hover,.dropzone.over{border-color:var(--accent);background:#1b2740}.dropzone-icon{color:var(--accent);font-size:30px}.dropzone-text{flex-direction:column;display:flex}.dropzone-text strong{font-size:15px}.dropzone-text span{color:var(--muted);font-size:12px}.alert{color:#fca5a5;background:#dc262624;border:1px solid #7f1d1d;border-radius:8px;padding:10px 14px;font-size:13px}.toolbar{flex-wrap:wrap;justify-content:space-between;gap:10px;display:flex}.toolbar-group{gap:8px;display:flex}.table-wrap{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);overflow:auto}.data-table{border-collapse:collapse;width:100%;font-size:13px}.data-table th,.data-table td{border:1px solid var(--line);padding:0}.data-table thead th{background:var(--panel-2);z-index:1;position:sticky;top:0}.th-inner{align-items:center;gap:4px;padding:4px 6px;display:flex}.col-name{color:var(--text);background:0 0;border:none;width:100%;padding:4px;font-size:13px;font-weight:700}.col-name:focus{outline:1px solid var(--accent);border-radius:4px}.data-table td input{width:100%;color:var(--text);background:0 0;border:none;min-width:90px;padding:8px;font-size:13px}.data-table td input:focus{outline:2px solid var(--accent);outline-offset:-2px;background:#16213a}.row-handle{background:var(--panel-2);color:var(--muted);text-align:center;white-space:nowrap;font-size:12px;padding:4px 6px!important}.row-handle span{margin-right:4px}.empty-cell{text-align:center;color:var(--muted);padding:18px!important}.empty-state{text-align:center;color:var(--muted);padding:40px}.floor-tab{height:100%;display:flex}.sidebar{background:var(--panel);border-right:1px solid var(--line);flex-direction:column;flex-shrink:0;gap:16px;width:290px;padding:16px;display:flex;overflow-y:auto}.panel{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);flex-direction:column;gap:10px;padding:14px;display:flex}.panel h3{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin:0;font-size:13px}.field{color:var(--muted);flex-direction:column;gap:4px;font-size:12px;display:flex}.field-label{color:var(--muted);font-size:12px}.field input,.field select{background:var(--bg);border:1px solid var(--line);color:var(--text);border-radius:6px;padding:7px 8px;font-size:13px}.field input[type=range]{padding:0}.field-grid{grid-template-columns:1fr 1fr;gap:8px;display:grid}.checks{flex-direction:column;gap:6px;max-height:160px;display:flex;overflow:auto}.check{color:var(--text);cursor:pointer;align-items:center;gap:8px;font-size:13px;display:flex}.muted{color:var(--muted);margin:0;font-size:12px}.swatches{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.swatch{cursor:pointer;border:2px solid #0000;border-radius:6px;width:26px;height:26px;padding:0}.swatch.active{box-shadow:0 0 0 2px var(--accent);border-color:#fff}.swatch.custom{background:0 0;width:30px;height:28px}.canvas-area{flex-direction:column;flex:1;min-width:0;display:flex}.canvas-toolbar{background:var(--panel);border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:8px 14px;display:flex}.ct-group{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.ct-title{background:var(--bg);border:1px solid var(--line);color:var(--text);border-radius:6px;min-width:170px;padding:7px 9px;font-size:13px}.ct-title:focus{outline:2px solid var(--accent);outline-offset:-1px}.ct-swatches{align-items:center;gap:5px;display:flex}.ct-swatches .swatch{width:22px;height:22px}.ct-swatches .swatch.custom{width:26px;height:24px}.ct-rotate{align-items:center;gap:4px;display:flex}.ct-rotate .rot-btn{border:1px solid var(--line);background:var(--panel);width:26px;height:26px;color:inherit;cursor:pointer;border-radius:6px;place-items:center;font-size:14px;line-height:1;display:grid}.ct-rotate .rot-btn:hover{background:#ffffff14}.ct-rotate .rot-val{text-align:center;font-variant-numeric:tabular-nums;opacity:.85;min-width:38px;font-size:12px}.ct-hint{color:var(--muted);font-size:13px}.ct-print,.ct-del{flex-shrink:0}.canvas-scroll{background:#0b1220;flex:1;padding:24px;overflow:auto}.canvas-viewport{flex-shrink:0}.canvas{transform-origin:0 0;border:1px solid var(--line);box-shadow:var(--shadow);background-color:#111a2e;background-image:linear-gradient(90deg,#94a3b81f 1px,#0000 1px),linear-gradient(#94a3b81f 1px,#0000 1px);border-radius:6px;position:relative}.marquee{border:1px solid var(--accent);pointer-events:none;z-index:10;background:#2563eb26;border-radius:2px;position:absolute}.ct-count{color:var(--text);white-space:nowrap;font-size:13px;font-weight:700}.canvas-hint{text-align:center;color:var(--muted);pointer-events:none;max-width:360px;font-size:14px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.block{color:#fff;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none;border:1px solid #ffffff26;border-radius:6px;padding:6px 8px;position:absolute;overflow:hidden;box-shadow:0 2px 6px #0006}.block:active{cursor:grabbing}.block.selected{outline-offset:1px;z-index:5;outline:2px solid #fff}.block-label{overflow-wrap:anywhere;word-break:break-word;text-shadow:0 1px 2px #0006;font-size:11px;font-weight:700;line-height:1.15}.block-details{opacity:.95;flex-direction:column;gap:1px;margin-top:2px;font-size:11px;font-weight:700;display:flex}.block-detail{overflow-wrap:anywhere;word-break:break-word;text-shadow:0 1px 2px #0006}.resize-handle{cursor:nwse-resize;touch-action:none;background:linear-gradient(135deg,#0000 50%,#ffffffd9 50%);border-bottom-right-radius:6px;width:14px;height:14px;position:absolute;bottom:0;right:0}.rotate-handle{cursor:grab;opacity:0;touch-action:none;background:#ffffffd9;border:1px solid #00000040;border-radius:4px;width:26px;height:7px;transition:opacity .12s;position:absolute;top:3px;left:50%;transform:translate(-50%)}.block:hover .rotate-handle,.block.selected .rotate-handle{opacity:1}.rotate-handle:active{cursor:grabbing}.watermark{pointer-events:none;z-index:6;background-color:#ffffff14;position:absolute;inset:0;-webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='220'%20height='140'%3E%3Ctext%20x='110'%20y='70'%20fill='%23000'%20font-family='Arial,sans-serif'%20font-size='16'%20font-weight='700'%20text-anchor='middle'%20transform='rotate(-30%20110%2070)'%3Efloorplan.cc%3C/text%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='220'%20height='140'%3E%3Ctext%20x='110'%20y='70'%20fill='%23000'%20font-family='Arial,sans-serif'%20font-size='16'%20font-weight='700'%20text-anchor='middle'%20transform='rotate(-30%20110%2070)'%3Efloorplan.cc%3C/text%3E%3C/svg%3E");-webkit-mask-size:220px 140px;mask-size:220px 140px;-webkit-mask-repeat:repeat;mask-repeat:repeat}.library-tab{height:100%;padding:22px;overflow:auto}.library-grid{grid-template-columns:1fr 1fr;gap:18px;max-width:1100px;margin:0 auto;display:grid}@media (width<=800px){.library-grid{grid-template-columns:1fr}}.lib-col{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:16px}.lib-head{justify-content:space-between;align-items:center;gap:10px;margin-bottom:14px;display:flex}.lib-head h2{margin:0;font-size:16px}.lib-list{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.lib-item{background:var(--panel-2);border:1px solid var(--line);border-radius:8px;justify-content:space-between;align-items:center;gap:10px;padding:10px 12px;display:flex}.lib-item-main{flex-direction:column;min-width:0;display:flex}.lib-item-main strong{white-space:nowrap;text-overflow:ellipsis;font-size:14px;overflow:hidden}.lib-meta{color:var(--muted);font-size:11px}.lib-item-actions{flex-shrink:0;gap:6px;display:flex}.toast{z-index:50;box-shadow:var(--shadow);border-radius:8px;padding:10px 18px;font-size:13px;font-weight:600;position:fixed;top:76px;left:50%;transform:translate(-50%)}.toast.ok{color:#bbf7d0;background:#14532d;border:1px solid #166534}.toast.err{color:#fecaca;background:#7f1d1d;border:1px solid #991b1b}.offline{text-align:center;max-width:520px;color:var(--muted);background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);margin:40px auto;padding:30px}.offline h2{color:var(--text)}.offline code{background:var(--panel-2);color:#93c5fd;border-radius:4px;padding:2px 6px}@media print{html,body{background:#fff;margin:0!important;padding:0!important}.topbar,.sidebar,.canvas-toolbar{display:none!important}.app,.content,.floor-tab,.canvas-area{height:auto!important;min-height:0!important;display:block!important;overflow:visible!important}.canvas-scroll{background:#fff;padding:0!important;overflow:visible!important}.canvas-viewport{width:auto!important;height:auto!important}.canvas{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-color:#fff;box-shadow:none!important;background-image:linear-gradient(90deg,#0000002e 1px,#0000 1px),linear-gradient(#0000002e 1px,#0000 1px)!important;border:none!important;border-radius:0!important;margin:0!important;transform:none!important}.block{-webkit-print-color-adjust:exact;print-color-adjust:exact;color:#000!important;box-shadow:none!important;background:#fff!important;border:1.5px solid #000!important}.block-label,.block-details,.block-detail{color:#000!important;text-shadow:none!important}.watermark{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-color:#0000001f!important}.canvas-hint{display:none}.resize-handle,.rotate-handle{display:none!important}}
