:root{--bg:#f6f7f5;--surface:#ffffff;--ink:#18211f;--muted:#5c6865;--line:#dde3e0;--brand:#0f6b5c;--brand-soft:#d9efe9;--area:rgba(20, 163, 139, .16);--area-edge:#0f6b5c;--grid:rgba(15, 107, 92, .22);--stage:#eef2f0;--bed:#7d97cf;--pillow:#eef2fa;--car:#e98a5b;--glass:#2c3a4a;--lot:#b9c0c4;--paint:#ffffff;--garage:#d6c7ad;--court:#3f8f6f;--hard:#d79b5d;--grass:#4f9d4a;--block:#a9a3b8;--person:#c2410c;--radius:14px}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#0f1413;--surface:#171e1c;--ink:#e7eeeb;--muted:#9aa8a4;--line:#2a3431;--brand:#4fd1b5;--brand-soft:#1d3a34;--area:rgba(79, 209, 181, .14);--area-edge:#4fd1b5;--grid:rgba(79, 209, 181, .2);--stage:#121917;--bed:#5a6b8f;--pillow:#9fb0d0;--lot:#4b5357;--paint:#e8ecee;--garage:#7d6f58;--block:#6f6884}}:root[data-theme=dark]{--bg:#0f1413;--surface:#171e1c;--ink:#e7eeeb;--muted:#9aa8a4;--line:#2a3431;--brand:#4fd1b5;--brand-soft:#1d3a34;--area:rgba(79, 209, 181, .14);--area-edge:#4fd1b5;--grid:rgba(79, 209, 181, .2);--stage:#121917}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.6 system-ui,-apple-system,segoe ui,Roboto,sans-serif}a{color:var(--brand)}.site-head,main,.site-foot{max-width:1180px;margin:0 auto;padding:0 16px}.site-head{display:flex;align-items:center;justify-content:space-between;height:60px}.brand{display:flex;gap:8px;align-items:center;font-weight:700;color:var(--ink);text-decoration:none}.brand svg{color:var(--brand)}.site-head nav a{margin-left:18px;color:var(--muted);text-decoration:none;font-size:.95rem}.site-head nav a:hover{color:var(--ink)}.hero{padding:8px 0 16px}.hero h1{font-size:clamp(1.7rem,4vw,2.5rem);line-height:1.15;margin:0 0 8px;letter-spacing:-.01em}.hero p{margin:0;color:var(--muted);max-width:62ch}.tool{display:grid;grid-template-columns:minmax(0,1fr)340px;gap:16px}.stage-wrap,.panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.stage-wrap{overflow:hidden;display:flex;flex-direction:column}.tabs{display:flex;gap:4px;padding:8px;border-bottom:1px solid var(--line)}.tab{border:0;background:0 0;padding:6px 12px;border-radius:8px;font:inherit;font-size:.9rem;color:var(--muted);cursor:pointer}.tab.is-on{background:var(--brand-soft);color:var(--ink);font-weight:600}.stage{position:relative;background:var(--stage);height:min(62vh,560px);min-height:320px}.stage[hidden]{display:none}#viz{width:100%;height:100%;display:block}.bg{fill:var(--stage)}.gridline{stroke:var(--grid);stroke-width:1}.area{fill:var(--area)}.labels text{fill:var(--ink);font-weight:600}.scalebar{position:absolute;left:12px;bottom:10px;display:flex;align-items:center;gap:8px;font-size:.78rem;color:var(--muted);background:color-mix(in srgb,var(--surface) 85%,transparent);padding:3px 8px;border-radius:6px}#scalebar-line{display:inline-block;height:6px;border:2px solid var(--muted);border-top:0;transition:width .25s ease}.tile-in{transform-box:fill-box;transform-origin:center;animation:pop .42s cubic-bezier(.2,.9,.3,1.25)both;animation-delay:inherit}.tile{animation:none}@keyframes pop{from{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}.tile.ghost{opacity:.5}.area-edge{fill:none;stroke:var(--area-edge);stroke-width:2.5}.ico-bed{fill:var(--bed);stroke:rgba(0,0,0,.25);stroke-width:1}.ico-pillow{fill:var(--pillow)}.ico-car{fill:var(--car);stroke:rgba(0,0,0,.25);stroke-width:1}.ico-glass{fill:var(--glass);opacity:.75}.ico-lot{fill:var(--lot);opacity:.55}.ico-paint{stroke:var(--paint);stroke-width:1.5}.ico-line{stroke:rgba(0,0,0,.3);stroke-width:1}.ico-garage{fill:var(--garage);stroke:rgba(0,0,0,.25);stroke-width:1}.ico-court{fill:var(--court)}.ico-hard{fill:var(--hard)}.ico-ring{fill:none;stroke:var(--paint);stroke-width:1.5}.ico-grass{fill:var(--grass)}.ico-block{fill:var(--block);stroke:rgba(0,0,0,.25);stroke-width:1}.ico-person{fill:var(--person);opacity:.85}.ico-head{fill:#f2c6a0}.person{transition:opacity .3s}.panel{padding:16px;display:flex;flex-direction:column;gap:16px}.readout .big{font-size:2rem;font-weight:750;line-height:1.1;letter-spacing:-.01em}.readout .conv{color:var(--muted);font-size:.92rem}.readout .fit{margin-top:8px;font-size:1rem}.readout .fit b{color:var(--brand)}.readout .note,.readout .dims{color:var(--muted);font-size:.85rem}.ctl label{display:block;font-weight:600;font-size:.85rem;margin-bottom:6px}.ctl label.sub{font-weight:500;color:var(--muted);margin:10px 0 2px}.row{display:flex;gap:8px;align-items:center}.ctl input[type=number],.ctl select{font:inherit;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--ink);min-width:0}#in-area{flex:1;font-size:1.1rem;font-weight:600}.dims-row input{width:100%}.unit-ft{color:var(--muted)}input[type=range]{width:100%;accent-color:var(--brand);margin-top:10px}.chips{display:flex;flex-wrap:wrap;gap:6px}.chip{border:1px solid var(--line);background:var(--bg);color:var(--ink);border-radius:999px;padding:4px 10px;font:inherit;font-size:.82rem;cursor:pointer}.chip.is-on{background:var(--brand);border-color:var(--brand);color:#fff}.chip.is-auto-pick{border-color:var(--brand)}.copy{font:inherit;padding:10px;border-radius:10px;border:1px solid var(--brand);background:0 0;color:var(--brand);font-weight:600;cursor:pointer}.copy:hover{background:var(--brand-soft)}.map-stage{display:flex;flex-direction:column}#map{flex:1;min-height:280px}.map-ctrl{display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center;padding:8px 12px;font-size:.85rem;border-top:1px solid var(--line);background:var(--surface)}.map-ctrl button{font:inherit;padding:4px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--ink);cursor:pointer}.map-ctrl label{display:flex;align-items:center;gap:6px}.map-ctrl input[type=range]{width:120px;margin:0}.map-ctrl .hint{color:var(--muted)}.map-handle{background:var(--brand);border:3px solid #fff;border-radius:50%;box-shadow:0 1px 4px rgba(0,0,0,.4);cursor:grab}.prose{max-width:760px;padding:24px 0 8px}.prose.page{padding-top:8px}.prose h2{font-size:1.35rem;margin:28px 0 8px}.prose h3.grp{font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:18px 0 6px}.facts{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:4px 18px 10px}.facts ul{padding-left:18px}.fine{color:var(--muted);font-size:.82rem}.sizegrid{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap;gap:8px}.sizegrid a{display:inline-block;padding:6px 12px;border:1px solid var(--line);border-radius:999px;background:var(--surface);text-decoration:none;font-size:.92rem}.sizegrid a[aria-current]{background:var(--brand);color:#fff;border-color:var(--brand)}.site-foot{border-top:1px solid var(--line);margin-top:40px;padding-top:16px;padding-bottom:32px;color:var(--muted);font-size:.88rem}.noscript{padding:12px}@media(max-width:860px){.tool{grid-template-columns:1fr}.stage{height:52vh}.site-head nav a{margin-left:12px}}@media(prefers-reduced-motion:reduce){.tile-in{animation:none}#scalebar-line{transition:none}}.stage-3d #three{position:absolute;inset:0}.stage-3d canvas{display:block}.cam-ctrl{position:absolute;top:10px;right:10px;display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end}.seg{display:inline-flex;background:var(--surface);border:1px solid var(--line);border-radius:9px;overflow:hidden}.seg button{border:0;background:0 0;font:inherit;font-size:.82rem;padding:6px 10px;color:var(--ink);cursor:pointer}.seg button+button{border-left:1px solid var(--line)}.seg button.is-on{background:var(--brand);color:#fff}.walls{display:inline-flex;align-items:center;gap:6px;font-size:.82rem;background:var(--surface);border:1px solid var(--line);border-radius:9px;padding:5px 10px}.hint3d{position:absolute;left:12px;bottom:10px;margin:0;font-size:.78rem;color:var(--muted);background:color-mix(in srgb,var(--surface) 85%,transparent);padding:3px 8px;border-radius:6px;pointer-events:none}.person-tag{position:absolute;transform:translate(-50%,calc(-100% - 10px));font-size:.75rem;font-weight:600;color:#fff;background:#c2410c;padding:2px 8px;border-radius:6px;white-space:nowrap;pointer-events:none}.person-tag::after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);border:6px solid transparent;border-top-color:#c2410c}@media(max-width:520px){.cam-ctrl{left:10px;right:10px;justify-content:flex-start}.seg button{padding:6px 9px}}