:root{--bg:#e8e4dc;--bg-panel:#f7f5f1;--ink:#1c1b19;--ink-muted:#6b6560;--line:#d4cfc6;--accent:#2f5d50;--accent-hover:#244a40;--warn:#e85d04;--shadow:0 1px 2px #1c1b190f;--font:"DM Sans", system-ui, sans-serif;--radius:6px}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:var(--font);color:var(--ink);background:radial-gradient(ellipse 80% 50% at 10% 0%, #2f5d5014, transparent 50%), radial-gradient(ellipse 60% 40% at 90% 100%, #e85d040f, transparent 45%), var(--bg);-webkit-font-smoothing:antialiased}.app{flex-direction:column;height:100%;min-height:100vh;display:flex}.toolbar{background:var(--bg-panel);border-bottom:1px solid var(--line);box-shadow:var(--shadow);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem 1.25rem;padding:.65rem 1rem;display:flex}.toolbar-brand{align-items:baseline;gap:.75rem;display:flex}.brand-mark{letter-spacing:-.02em;color:var(--accent);margin:0;font-size:1.25rem;font-weight:700;line-height:1.2}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.project-name-field{align-items:center;display:flex}.project-name-input{width:min(14rem,40vw);font:inherit;border:1px solid var(--line);border-radius:var(--radius);background:#fff;padding:.3rem .5rem;font-size:.875rem;font-weight:500}.project-name-input::placeholder{color:var(--ink-muted);font-weight:400}.brand-scale{color:var(--ink-muted);font-size:.85rem}.toolbar-actions{flex-wrap:wrap;gap:.4rem;display:flex}.btn{font:inherit;color:var(--ink);border:1px solid var(--line);border-radius:var(--radius);cursor:pointer;background:#fff;justify-content:center;align-items:center;padding:.4rem .75rem;font-size:.875rem;font-weight:500;transition:background .15s,border-color .15s,color .15s;display:inline-flex}.btn:hover:not(:disabled){background:#faf9f7;border-color:#b8b0a4}.btn:focus-visible,.btn:focus-within{outline:2px solid var(--accent);outline-offset:2px}.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);border-color:var(--accent-hover);color:#fff}.btn-active{border-color:var(--warn);color:var(--warn);background:#fff4e8}.btn-danger{color:#b42318;background:#fff8f7;border-color:#e8c4c0}.btn-danger:hover:not(:disabled){color:#912018;background:#fef3f2;border-color:#d9a8a3}.btn-warn{color:var(--warn);background:#fff8f0;border-color:#f0c9a8}.btn-warn:hover:not(:disabled){color:#c24e03;background:#fff4e8;border-color:#e8b48a}.btn-sm{padding:.3rem .6rem;font-size:.8rem}.btn-icon{min-width:2.125rem;min-height:2.125rem;padding:.45rem}.btn-icon .icon{flex-shrink:0;width:1.125rem;height:1.125rem;display:block}.icon-svg svg{width:100%;height:100%;display:block}.toolbar-calibrate{border-radius:var(--radius);background:#fff8f0;border:1px solid #f0c9a8;flex-wrap:wrap;align-items:center;gap:.4rem;padding:.15rem .35rem;display:flex}.calibrate-hint{color:var(--ink-muted);white-space:nowrap;font-size:.8rem}.calibrate-distance{align-items:center;gap:.25rem;display:inline-flex}.calibrate-distance-label{color:var(--ink-muted);font-size:.8rem}.calibrate-distance input{width:4.5rem;font:inherit;border:1px solid var(--line);border-radius:var(--radius);background:#fff;padding:.3rem .4rem;font-size:.875rem}.sidebar{background:var(--bg-panel);border-right:1px solid var(--line);flex-direction:column;flex-shrink:0;width:240px;display:flex;overflow:hidden}.sidebar-layer-nav{border-bottom:1px solid var(--line);flex-direction:row;flex-shrink:0;align-items:center;gap:.35rem;padding:.65rem;display:flex}.sidebar-layer-nav .btn-icon{flex:1;min-width:0}.sidebar-body{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.sidebar-layer-tools{flex-direction:column;gap:.75rem;padding:.75rem .65rem 1rem;display:flex;overflow-y:auto}.sidebar-layer-tools--fill{flex:1;min-height:0;padding-top:.35rem;overflow:hidden}.sidebar-layer-tools--fill .sidebar-list{flex:1;min-height:0}.sidebar-tools-section{flex-direction:column;gap:.4rem;display:flex}.sidebar-tools-label{text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted);font-size:.7rem;font-weight:600}.sidebar-room-name{width:100%}.layer-toggle{flex-wrap:wrap;gap:.25rem;display:flex}.layer-name-input{font:inherit;border:1px solid var(--line);border-radius:var(--radius);background:#fff;padding:.3rem .5rem;font-size:.875rem}.sidebar-header{border-bottom:1px solid var(--line);padding:.85rem 1rem .5rem}.sidebar-header--compact{border-bottom:none;padding:.65rem .65rem .35rem}.sidebar-list--flush{padding-top:0}.sidebar-header h2{margin:0;font-size:.95rem;font-weight:650}.sidebar-hint{color:var(--ink-muted);margin:.35rem 0 0;font-size:.75rem;line-height:1.35}.sidebar-list{flex:1;padding:.5rem .65rem 1rem;overflow-y:auto}.workspace{flex:1;min-height:0;display:flex}.sidebar-category{margin-bottom:.85rem}.sidebar-category h3{text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted);margin:0 0 .35rem;padding:0 .25rem;font-size:.7rem;font-weight:600}.sidebar-category ul{flex-direction:column;gap:.25rem;margin:0;padding:0;list-style:none;display:flex}.furniture-item{width:100%;font:inherit;text-align:left;border:1px solid var(--line);border-radius:var(--radius);cursor:pointer;background:#fff;align-items:center;gap:.55rem;padding:.4rem .45rem;transition:border-color .15s,background .15s;display:flex}.furniture-item:hover:not(:disabled){border-color:var(--accent);background:#f3f8f6}.furniture-item:disabled{opacity:.5;cursor:not-allowed}.furniture-item[draggable=true]{cursor:grab}.furniture-item[draggable=true]:active{cursor:grabbing}.furniture-swatch{object-fit:contain;border-radius:3px;flex-shrink:0;width:1.1rem;height:1.1rem;display:block;overflow:hidden}.furniture-meta{flex-direction:column;min-width:0;display:flex}.furniture-name{font-size:.85rem;font-weight:500}.furniture-dims{color:var(--ink-muted);font-size:.7rem}.canvas-wrap{touch-action:none;background-color:#e4dfd6;background-image:linear-gradient(45deg,#ddd8cf 25%,#0000 25%),linear-gradient(-45deg,#ddd8cf 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#ddd8cf 75%),linear-gradient(-45deg,#0000 75%,#ddd8cf 75%);background-position:0 0,0 8px,8px -8px,-8px 0;background-repeat:repeat,repeat,repeat,repeat;background-size:16px 16px;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;min-width:0;min-height:0;position:relative;overflow:hidden}.canvas-wrap.canvas-panning,.canvas-wrap.canvas-panning .konvajs-content{cursor:grab}.canvas-wrap.canvas-panning:active,.canvas-wrap.canvas-panning:active .konvajs-content{cursor:grabbing}.canvas-empty{height:100%;min-height:320px;color:var(--ink-muted);justify-content:center;align-items:center;font-size:.95rem;display:flex}.canvas-error-boundary{background-color:#f7f5f0;flex:1;justify-content:center;align-items:center;min-height:360px;padding:2rem;display:flex}.canvas-error-card{border:1px solid var(--line);border-radius:var(--radius);text-align:center;background:#fff;width:100%;max-width:480px;padding:1.5rem;box-shadow:0 4px 12px #00000014}.canvas-error-title{color:#b42318;margin:0 0 .5rem;font-size:1.15rem;font-weight:600}.canvas-error-message{color:var(--ink-muted);margin:0 0 1rem;font-size:.875rem;line-height:1.5}.canvas-error-details{color:#912018;text-align:left;white-space:pre-wrap;word-break:break-word;background:#fff8f7;border:1px solid #e8c4c0;border-radius:4px;margin:0 0 1.25rem;padding:.75rem;font-family:monospace;font-size:.8rem;overflow-x:auto}.canvas-error-actions{flex-wrap:wrap;justify-content:center;gap:.5rem;display:flex}.canvas-wrap.canvas-draw-rooms:not(.canvas-panning) .konvajs-content,.canvas-wrap.canvas-draw-paint:not(.canvas-panning) .konvajs-content,.canvas-wrap.canvas-draw-eraser:not(.canvas-panning) .konvajs-content,.canvas-wrap.canvas-eyedropper:not(.canvas-panning) .konvajs-content{cursor:crosshair}.paint-tools{flex-wrap:wrap}.paint-palette{flex-wrap:wrap;align-items:center;gap:.3rem;display:flex}.paint-swatch{cursor:pointer;border:1px solid #0000001f;border-radius:3px;width:1.15rem;height:1.15rem;padding:0}.paint-swatch-active{outline:2px solid var(--accent);outline-offset:1px}.paint-color-input{cursor:pointer;background:conic-gradient(red,#ff0,#0f0,#0ff,#00f,#f0f,red);border:1px solid #0000001f;border-radius:3px;width:1.15rem;height:1.15rem;position:relative;overflow:hidden}.paint-color-input input[type=color]{opacity:0;cursor:pointer;border:none;width:100%;height:100%;padding:0;position:absolute;inset:0}.paint-eyedropper-btn{align-items:center;gap:.25rem;display:inline-flex}.paint-eyedropper-icon{width:.95rem;height:.95rem}.zoom-controls{z-index:2;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);background:#f7f5f1eb;align-items:center;gap:.25rem;padding:.25rem;display:flex;position:absolute;top:.75rem;right:.75rem}.zoom-controls .btn-icon.btn-sm{min-width:1.85rem;min-height:1.85rem;padding:.3rem}.zoom-controls .btn-icon.btn-sm .icon{width:1rem;height:1rem}.floating-labels-btn{margin-left:.15rem}.zoom-label{font-variant-numeric:tabular-nums;min-width:3.25rem}.zoom-hint{z-index:2;color:var(--ink-muted);border-radius:var(--radius);pointer-events:none;background:#f7f5f1e0;margin:0;padding:.25rem .5rem;font-size:.7rem;position:absolute;bottom:.65rem;left:.75rem}.status-bar{color:var(--ink-muted);background:var(--bg-panel);border-top:1px solid var(--line);flex-wrap:wrap;align-items:center;gap:.35rem .5rem;padding:.35rem 1rem;font-size:.8rem;display:flex}.status-bar strong{font-variant-numeric:tabular-nums;color:var(--ink);font-weight:600}.status-bar-sep{color:var(--line)}.status-bar-save{color:var(--ink-muted);font-size:.8rem}.status-bar-save--saved{color:var(--accent)}.status-bar-save--saving{color:var(--ink-muted)}.status-bar-save--unsaved{color:var(--warn)}.status-bar-save--error{color:#b42318}.rooms-panel{background:var(--bg-panel);border-left:1px solid var(--line);flex-direction:column;flex-shrink:0;width:240px;display:flex;overflow:hidden}.rooms-panel-header{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.rooms-panel-opacity{border-bottom:1px solid var(--line);align-items:center;gap:.5rem;padding:.5rem .75rem .65rem;display:flex}.rooms-panel-opacity-label{color:var(--ink-muted);white-space:nowrap;font-size:.8rem}.rooms-panel-opacity input[type=range]{min-width:0;accent-color:var(--accent);flex:1}.rooms-panel-opacity-value{font-variant-numeric:tabular-nums;color:var(--ink-muted);min-width:2.5rem;font-size:.8rem}.rooms-panel-collapse{flex-shrink:0}.rooms-panel--collapsed{width:2.25rem}.rooms-panel-toggle{width:100%;height:100%;min-height:8rem;font:inherit;color:var(--ink);cursor:pointer;writing-mode:vertical-rl;background:0 0;border:none;justify-content:center;align-items:center;padding:.75rem .15rem;font-size:.8rem;font-weight:650;display:flex;transform:rotate(180deg)}.rooms-panel-toggle:hover{background:#faf9f7}.rooms-panel-empty{padding:0 .25rem}.rooms-panel-list{flex-direction:column;gap:.25rem;margin:0;padding:0;list-style:none;display:flex}.room-list-item{width:100%;font:inherit;text-align:left;border:1px solid var(--line);border-radius:var(--radius);cursor:pointer;background:#fff;align-items:center;gap:.55rem;padding:.4rem .45rem;transition:border-color .15s,background .15s;display:flex}.room-list-item:hover,.room-list-item--selected{border-color:var(--accent);background:#f3f8f6}.room-list-meta{flex-direction:column;min-width:0;display:flex}.room-list-name{text-overflow:ellipsis;white-space:nowrap;font-size:.85rem;font-weight:500;overflow:hidden}.room-list-size{font-variant-numeric:tabular-nums;color:var(--ink-muted);font-size:.7rem}.room-list-sep{color:var(--line)}@media (width<=720px){.workspace{flex-direction:column}.sidebar{border-right:none;border-bottom:1px solid var(--line);width:100%;max-height:200px}.rooms-panel{border-left:none;border-top:1px solid var(--line);width:100%;max-height:220px}.rooms-panel--collapsed{width:100%;max-height:none}.rooms-panel-toggle{writing-mode:horizontal-tb;height:auto;min-height:0;padding:.4rem .75rem;transform:none}.zoom-hint{display:none}}.modal-backdrop{z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#1c1b1973;justify-content:center;align-items:center;padding:1rem;animation:.15s ease-out modal-fade-in;display:flex;position:fixed;inset:0}.modal-dialog{background:var(--bg-panel);border:1px solid var(--line);border-radius:calc(var(--radius) * 1.5);outline:none;width:100%;max-width:440px;padding:1.25rem 1.5rem;animation:.15s ease-out modal-scale-in;box-shadow:0 10px 25px -5px #00000026,0 8px 10px -6px #0000001a}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-scale-in{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}.modal-header{margin-bottom:.5rem}.modal-title{color:var(--ink);margin:0;font-size:1.15rem;font-weight:700}.modal-description{color:var(--ink-muted);margin:0 0 1.25rem;font-size:.875rem;line-height:1.45}.modal-actions{flex-direction:column;gap:.5rem;display:flex}.modal-actions--horizontal{flex-direction:row;justify-content:flex-end;gap:.65rem;display:flex}.modal-option-btn{text-align:left;flex-direction:column;align-items:flex-start;gap:.2rem;width:100%;padding:.65rem .85rem;display:flex}.modal-option-title{font-size:.9rem;font-weight:600}.modal-option-desc{opacity:.8;font-size:.775rem;font-weight:400}
