@font-face{font-family:Archivo Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(../media/archivo-vietnamese-wght-normal.3cb37nm8mowb2.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Archivo Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(../media/archivo-latin-ext-wght-normal.3m-fabn93du09.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Archivo Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(../media/archivo-latin-wght-normal.1_q0qa17ptz5n.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(../media/ibm-plex-mono-cyrillic-ext-400-normal.09jq5v9-1wf71.woff2)format("woff2"),url(../media/ibm-plex-mono-cyrillic-ext-400-normal.2iaubq2jy0rx3.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(../media/ibm-plex-mono-cyrillic-400-normal.0m1ahpdxrpokj.woff2)format("woff2"),url(../media/ibm-plex-mono-cyrillic-400-normal.2-z93d2j9-3s0.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(../media/ibm-plex-mono-vietnamese-400-normal.3a7fs2yw914a9.woff2)format("woff2"),url(../media/ibm-plex-mono-vietnamese-400-normal.2kzc8ichkozg5.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(../media/ibm-plex-mono-latin-ext-400-normal.1hjaitcyq2e2r.woff2)format("woff2"),url(../media/ibm-plex-mono-latin-ext-400-normal.0nrwft7nlo5oa.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(../media/ibm-plex-mono-latin-400-normal.3xdfs0-p_zi4c.woff2)format("woff2"),url(../media/ibm-plex-mono-latin-400-normal.2lhng2ntocry9.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(../media/ibm-plex-mono-cyrillic-ext-500-normal.28wp48yubenc3.woff2)format("woff2"),url(../media/ibm-plex-mono-cyrillic-ext-500-normal.41yczc5zdkwdh.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(../media/ibm-plex-mono-cyrillic-500-normal.26ox_itp_alxp.woff2)format("woff2"),url(../media/ibm-plex-mono-cyrillic-500-normal.1eaan1mch682e.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(../media/ibm-plex-mono-vietnamese-500-normal.0s1z3n-ysad7w.woff2)format("woff2"),url(../media/ibm-plex-mono-vietnamese-500-normal.2g79xp9gzp1kn.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(../media/ibm-plex-mono-latin-ext-500-normal.1cuq9_67cn48n.woff2)format("woff2"),url(../media/ibm-plex-mono-latin-ext-500-normal.1tdw_l2v4yhc_.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(../media/ibm-plex-mono-latin-500-normal.11q3guvgd1r20.woff2)format("woff2"),url(../media/ibm-plex-mono-latin-500-normal.1fgk-kmy-32_a.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
:root{--bg:#e7ebec;--panel:#f5f7f7;--surface:#fff;--fg:#162024;--muted:#5a676d;--line:#d2d9dc;--accent:#2d6a9f;--accent-soft:#d9e7f3;--accent-fg:#fff;--ok:#2d7d46;--warn:#a86a12;--crit:#c2362f;--info:#4f6f7d;--scene-bg:#dde3e5;--grid-minor:#cfd6d8;--grid-major:#a9b4b7;--wall:#e9e6df;--edge:#56646a;--slab:#c9d3d8;--timber:#b98a55;--roof:#a0574a;--res-pos:#d7302b;--res-neg:#2166ac;--res-mid:#f2f2f2;--font-ui:"Archivo Variable", system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, monospace}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#0d1215;--panel:#141b1f;--surface:#1b242a;--fg:#e6edf0;--muted:#9fb0b8;--line:#2c3a42;--accent:#6fb0e8;--accent-soft:#1b3044;--accent-fg:#08131d;--ok:#62c784;--warn:#e8ad4f;--crit:#f07366;--info:#94b8c8;--scene-bg:#182126;--grid-minor:#26323a;--grid-major:#3d4c55;--wall:#56626a;--edge:#b4c3ca;--slab:#3a4850;--timber:#c99a62;--roof:#c0705f;--res-pos:#f07366;--res-neg:#5aa2e0;--res-mid:#2a343a;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}:root[data-theme=dark]{--bg:#0d1215;--panel:#141b1f;--surface:#1b242a;--fg:#e6edf0;--muted:#9fb0b8;--line:#2c3a42;--accent:#6fb0e8;--accent-soft:#1b3044;--accent-fg:#08131d;--ok:#62c784;--warn:#e8ad4f;--crit:#f07366;--info:#94b8c8;--scene-bg:#182126;--grid-minor:#26323a;--grid-major:#3d4c55;--wall:#56626a;--edge:#b4c3ca;--slab:#3a4850;--timber:#c99a62;--roof:#c0705f;--res-pos:#f07366;--res-neg:#5aa2e0;--res-mid:#2a343a;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body{height:100%;margin:0}body{background:var(--bg);color:var(--fg);font-family:var(--font-ui);font-size:14px;line-height:1.45}a{color:var(--accent)}[hidden]{display:none!important}.page{max-width:1240px;margin:0 auto;padding:20px 16px 60px}.app{grid-template-columns:370px minmax(0,1fr);gap:12px;height:100%;padding:12px 16px;display:grid}.panel{background:var(--panel);border:1px solid var(--line);border-radius:10px;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.panel>section,.panel>header,.panel>footer{border-bottom:1px solid var(--line);padding:14px 16px}.panel>footer{border-bottom:0;margin-top:auto}.brand{align-items:center;gap:12px;display:flex}.brand svg{flex:none;display:block}h1{letter-spacing:-.01em;margin:0;font-size:18px;font-weight:700}.brand p{color:var(--muted);margin:2px 0 0;font-size:12px}h2{text-transform:uppercase;letter-spacing:.09em;color:var(--muted);justify-content:space-between;align-items:center;gap:8px;margin:0 0 10px;font-size:11px;font-weight:600;display:flex}h3.sub{margin:12px 0 6px;font-size:12.5px}.tabs{border-bottom:1px solid var(--line);background:var(--panel);z-index:1;gap:2px;padding:6px 8px 0;display:flex;position:sticky;top:0}.tabs button{font:600 12.5px var(--font-ui);color:var(--muted);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;flex:1;justify-content:center;align-items:center;gap:5px;padding:8px 4px;display:inline-flex}.tabs button[aria-selected=true]{color:var(--fg);border-bottom-color:var(--accent)}.badge{font:600 10px var(--font-mono);background:var(--crit);color:#fff;border-radius:99px;padding:0 5px}.dims{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-bottom:8px;display:grid}.dims.two{grid-template-columns:repeat(2,minmax(0,1fr))}.field{color:var(--muted);flex-direction:column;gap:4px;min-width:0;margin-bottom:8px;font-size:12px;display:flex}.dims .field{margin-bottom:0}.field .inp{background:var(--surface);border:1px solid var(--line);border-radius:6px;align-items:center;padding:0 8px;display:flex}.field input,.field select{width:100%;min-width:0;color:var(--fg);font:500 13px var(--font-mono);font-variant-numeric:tabular-nums;background:0 0;border:0;padding:7px 0}.field input.text,.field select{font-family:var(--font-ui)}.field input:focus,.field select:focus{outline:none}.field .inp:focus-within{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.field select option{background:var(--surface);color:var(--fg)}.unit{font:11px var(--font-mono);color:var(--muted);white-space:nowrap;padding-left:4px}.check{cursor:pointer;align-items:flex-start;gap:8px;margin:6px 0;font-size:12.5px;display:flex}.check input{accent-color:var(--accent);margin-top:2px}.muted{color:var(--muted);font-size:12.5px}.panel p{margin:6px 0}.disclaimer{font-size:11.5px;margin-top:10px!important}.row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.row.between{justify-content:space-between}.btn{font:600 12.5px var(--font-ui);border:1px solid var(--line);background:var(--surface);color:var(--fg);cursor:pointer;white-space:nowrap;border-radius:6px;padding:7px 11px}.btn:hover:not(:disabled){border-color:var(--accent)}.btn:disabled{opacity:.5;cursor:default}.btn:focus-visible,select:focus-visible,.seg button:focus-visible,.tabs button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.btn.primary{background:var(--accent);color:var(--accent-fg);border-color:var(--accent)}.btn.sm{padding:3px 8px;font-size:11.5px}.btn.danger:hover{border-color:var(--crit);color:var(--crit)}button.link{color:var(--fg);cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;padding:2px 0}button.link:hover{color:var(--accent)}.verdict{border-radius:99px;padding:2px 8px;font-size:13px;font-weight:600;display:inline-block}.v-good{background:color-mix(in srgb, var(--ok) 16%, transparent);color:var(--ok)}.v-mid{background:color-mix(in srgb, var(--warn) 16%, transparent);color:var(--warn)}.v-bad{background:color-mix(in srgb, var(--crit) 16%, transparent);color:var(--crit)}.metrics{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin:10px 0 0;display:grid}.metrics div{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:6px 8px}.metrics small{color:var(--muted);letter-spacing:.04em;font-size:10.5px;display:block}.metrics span{font:500 14px var(--font-mono);font-variant-numeric:tabular-nums}.sev{font:600 9.5px var(--font-mono);text-transform:uppercase;color:#fff;border-radius:3px;flex:none;padding:2px 5px}.sev.fail{background:var(--crit)}.sev.warn{background:var(--warn)}.sev.ok{background:var(--ok)}.sev.info{background:var(--info)}table{border-collapse:collapse;width:100%;font-size:12px}th{text-align:left;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid var(--line);padding:4px;font-size:10.5px;font-weight:600}td{border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums;padding:5px 4px}td.n,th.n{text-align:right}td.n{font-family:var(--font-mono)}.storeys tr{cursor:pointer}.storeys tr.cur td{background:var(--accent-soft)}.cell{width:100%;color:var(--fg);font:500 12.5px var(--font-ui);background:0 0;border:1px solid #0000;border-radius:4px;padding:3px 4px}.cell.n{font-family:var(--font-mono);text-align:right;width:64px}.cell:focus{border-color:var(--accent);background:var(--surface);outline:none}.pill{font:600 9.5px var(--font-mono);text-transform:uppercase;border:1px solid var(--line);color:var(--muted);border-radius:99px;padding:1px 6px}.combos{font:12px var(--font-mono);flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.radio-list{flex-direction:column;gap:6px;font-size:13px;display:flex}.radio-list input{accent-color:var(--accent)}.checks{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.checks li{background:var(--surface);border:1px solid var(--line);border-radius:7px;padding:7px 9px;font-size:12.5px}.checks li.link{cursor:pointer}.checks li.link:hover{border-color:var(--accent)}.checks li.st-fail{border-left:3px solid var(--crit)}.checks li.st-warn{border-left:3px solid var(--warn)}.checks .row1{align-items:center;gap:8px;display:flex}.checks .row1 strong{flex:1;min-width:0;font-weight:600}.checks .ref{font:11px var(--font-mono);color:var(--muted);margin:2px 0 3px}.checks .det{color:var(--muted);font-size:12px}.ubar{background:color-mix(in srgb, var(--line) 70%, transparent);border-radius:4px;flex:none;width:74px;height:16px;display:inline-block;position:relative;overflow:hidden}.ubar i{position:absolute;inset:0 auto 0 0}.ubar.ok i{background:color-mix(in srgb, var(--ok) 45%, transparent)}.ubar.warn i{background:color-mix(in srgb, var(--warn) 55%, transparent)}.ubar.crit i{background:color-mix(in srgb, var(--crit) 60%, transparent)}.ubar b{font:600 10.5px/16px var(--font-mono);color:var(--fg);padding-left:5px;position:relative}.diagram{background:var(--surface);border:1px solid var(--line);border-radius:6px;width:100%;height:auto;display:block}.diagram .member{stroke:var(--fg);stroke-width:2px}.diagram .m-max{fill:color-mix(in srgb, var(--res-pos) 30%, transparent);stroke:var(--res-pos);stroke-width:.8px}.diagram .m-min{fill:color-mix(in srgb, var(--res-neg) 30%, transparent);stroke:var(--res-neg);stroke-width:.8px}.diagram .support{fill:none;stroke:var(--muted)}.diagram .dtxt{font:10px var(--font-mono);fill:var(--muted)}.stage{border:1px solid var(--line);background:var(--scene-bg);border-radius:10px;min-height:0;position:relative;overflow:hidden}.view{z-index:0;position:absolute;inset:0}.view canvas{touch-action:none;display:block}.toolbar{pointer-events:none;flex-wrap:wrap;align-items:center;gap:8px;display:flex;position:absolute;top:10px;left:10px;right:10px}.toolbar>*{pointer-events:auto}.seg{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:2px;display:inline-flex}.seg button{font:600 12px var(--font-ui);color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:5px;padding:5px 10px}.seg button[aria-pressed=true]{background:var(--fg);color:var(--panel)}.seg button:disabled{opacity:.45;cursor:default}.status{font:600 12px var(--font-ui);background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:6px 10px}.status.ok{color:var(--ok)}.status.fail,.status.err{color:var(--crit)}.status.busy{color:var(--muted)}.legend{background:color-mix(in srgb, var(--panel) 92%, transparent);border:1px solid var(--line);font:11.5px var(--font-mono);border-radius:7px;flex-wrap:wrap;align-items:center;gap:4px 10px;max-width:calc(100% - 340px);padding:6px 9px;display:flex;position:absolute;bottom:10px;left:10px}.legend .muted{font-family:var(--font-ui);font-size:11.5px}.legend .sw{vertical-align:-2px;border-radius:3px;width:12px;height:12px;margin-right:5px;display:inline-block}.legend .ramp{border-radius:3px;width:140px;height:10px;display:inline-block}.hint{text-align:right;max-width:310px;color:var(--muted);background:color-mix(in srgb, var(--panel) 92%, transparent);border:1px solid var(--line);border-radius:7px;padding:6px 9px;font-size:12px;position:absolute;bottom:10px;right:10px}.hint.active{color:var(--accent);border-color:var(--accent);font-weight:600}.toast{background:var(--fg);color:var(--panel);z-index:5;border-radius:6px;max-width:90%;padding:7px 12px;font-size:12.5px;font-weight:500;position:absolute;top:54px;left:50%;transform:translate(-50%)}.toast.err{background:var(--crit);color:#fff;top:96px}.inspector{background:var(--panel);border:1px solid var(--line);z-index:3;border-radius:10px;width:330px;max-height:calc(100% - 120px);padding:12px 14px;position:absolute;top:56px;right:10px;overflow-y:auto;box-shadow:0 6px 24px #00000024}.inspector header{justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px;display:flex}.inspector header span{gap:4px;display:flex}.inspector p{margin:6px 0}.list-head{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);justify-content:space-between;align-items:center;margin:10px 0 4px;font-size:11px;font-weight:600;display:flex}.openings{margin:0;padding:0;font-size:12.5px;list-style:none}.mini-checks{border-top:1px solid var(--line);flex-direction:column;gap:5px;margin:10px 0 0;padding:8px 0 0;font-size:12px;list-style:none;display:flex}.mini-checks li{justify-content:space-between;align-items:center;gap:8px;display:flex}.plan{touch-action:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;display:block;position:absolute;inset:0}.plan.tool-wall,.plan.tool-slab,.plan.tool-hole,.plan.tool-opening{cursor:crosshair}.plan .g-minor{stroke:var(--grid-minor);stroke-width:1px}.plan .g-major{stroke:var(--grid-major);stroke-width:1px}.plan .slab{fill:color-mix(in srgb, var(--slab) 55%, transparent);stroke:var(--edge);stroke-width:1px;stroke-dasharray:5 3}.plan .slab.sel{stroke:var(--accent);stroke-width:2px}.plan .hole{fill:var(--scene-bg);stroke:var(--edge);stroke-width:1px}.plan .hole.sel{stroke:var(--accent);stroke-width:2px}.plan .ghost{fill:none;stroke:var(--muted);stroke-width:1px;stroke-dasharray:3 3}.plan .wall{fill:var(--wall);stroke:var(--edge);stroke-width:1.2px;cursor:pointer}.plan .wall.nlb{fill:color-mix(in srgb, var(--wall) 50%, transparent);stroke-dasharray:4 2}.plan .wall.sel{stroke:var(--accent);stroke-width:2.5px}.plan .opening{fill:var(--surface);stroke:var(--edge);stroke-width:.8px;cursor:pointer}.plan .opening.door{fill:color-mix(in srgb, var(--surface) 70%, var(--accent-soft))}.plan .opening.sel{stroke:var(--accent);stroke-width:2px}.plan .handle{fill:var(--accent);stroke:var(--panel);stroke-width:2px;cursor:move}.plan .preview{stroke:var(--accent);stroke-width:3px;stroke-dasharray:6 4}.plan .preview-rect{fill:color-mix(in srgb, var(--accent) 15%, transparent);stroke:var(--accent);stroke-width:1.5px}.plan .snap{fill:var(--accent)}.plan .dimtxt{font:500 11px var(--font-mono);fill:var(--fg);paint-order:stroke;stroke:var(--scene-bg);stroke-width:3px;pointer-events:none}.plan .coords{font:11px var(--font-mono);fill:var(--muted)}@media (max-width:900px){.app{grid-template-rows:auto minmax(420px,1fr);grid-template-columns:1fr;height:auto;min-height:100%}.panel{max-height:50vh}.inspector{width:calc(100% - 20px)}}.card{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:22px 24px}.login{max-width:420px;margin:48px auto}.login .seg{width:100%}.login .seg button{flex:1}.errs{color:var(--crit);margin:0;font-size:12.5px}.account-line{justify-content:space-between;align-items:center;gap:8px;font-size:12.5px;display:flex}.projects{flex-direction:column;gap:4px;margin:8px 0 0;padding:0;list-style:none;display:flex}.projects li{align-items:center;gap:6px;font-size:12.5px;display:flex}.projects li.cur button.link{color:var(--accent);font-weight:600}.projects li button.link{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}
