:root{--bg:#f3efe7;--card:#faf7f1;--panel:#fff;--panel2:#faf7f1;--line:#e4ddd1;--line-strong:#cfc5b6;--ink:#26221f;--text:var(--ink);--muted:#6e655c;--accent:#b4552d;--accent-hover:#9c4624;--accent-ink:#fff;--accent-soft:#f6e3d8;--accent-ring:#b4552d40;--pass:#3e7a4e;--pass-soft:#e4f0e7;--warn:#a3611b;--warn-soft:#f7ead8;--fail:#b42318;--fail-soft:#fdecea;--stage:#1a1a20;--stage-2:#2c2c35;--stage-ink:#f4f1ea;--radius:18px;--radius-sm:12px;--shadow:0 2px 10px #26221f0f;--font:"Avenir Next", "Segoe UI", system-ui, -apple-system, sans-serif;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;font-family:var(--font)}*{box-sizing:border-box}html,body,#root{background:var(--bg);height:100%;color:var(--text);margin:0}body{overscroll-behavior:none;-webkit-tap-highlight-color:transparent}button,select,input{font:inherit;color:inherit}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}button{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-sm);cursor:pointer;min-height:38px;padding:8px 12px;font-weight:600;transition:border-color .12s,background .12s,transform 50ms}button:hover:not(:disabled){border-color:var(--accent)}button:active:not(:disabled){transform:translateY(1px)}button:disabled{opacity:.45;cursor:not-allowed}button.on{background:var(--accent-soft);color:var(--accent-hover);border-color:var(--accent);font-weight:700}button.primary{background:var(--accent);color:var(--accent-ink);border-color:var(--accent);font-weight:700}button.primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover)}button.ghost{background:0 0;border-style:dashed}select{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;min-height:38px;padding:8px}.app{flex-direction:column;height:100%;display:flex}header{border-bottom:1px solid var(--line);background:var(--card);justify-content:space-between;align-items:center;padding:10px 16px;display:flex}header h1{letter-spacing:-.01em;margin:0;font-size:19px;font-weight:700}header h1 small{color:var(--muted);letter-spacing:.06em;text-transform:uppercase;margin-left:10px;font-size:12px;font-weight:500}.hdr-actions{gap:8px;display:flex}.tabs{display:none}main{flex:1;grid-template-columns:320px minmax(320px,1fr) 320px 360px;min-height:0;display:grid}.panel{border-right:1px solid var(--line);background:var(--panel);min-height:0;padding:14px;overflow:auto}.panel h3{text-transform:uppercase;letter-spacing:.1em;color:var(--muted);margin:20px 0 8px;font-size:11px;font-weight:700}.panel h3:first-child{margin-top:0}.seg{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-sm);gap:4px;margin-bottom:10px;padding:3px;display:flex}.seg button{background:0 0;border-color:#0000;border-radius:9px;flex:1;min-height:34px;padding:6px 4px}.seg button.on{background:var(--panel);color:var(--accent-hover);border-color:var(--line);box-shadow:var(--shadow)}.row{flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0;display:flex}.row.tools button{flex:1;padding:6px 4px;font-size:13px}.slider{margin:10px 0;display:block}.slider>span{color:var(--muted);align-items:center;gap:6px;font-size:13px;display:flex}.slider>span b{color:var(--text);font-variant-numeric:tabular-nums;margin-left:auto}.slider input[type=range]{width:100%;height:28px;accent-color:var(--accent)}.num{background:var(--panel);border:1px solid var(--line);text-align:right;border-radius:8px;width:74px;margin-left:auto;padding:4px 6px}.slider em{width:22px;font-size:12px;font-style:normal}.chk{color:var(--muted);align-items:center;gap:6px;font-size:13px;display:flex}.chk.big{color:var(--text);font-size:14px}.chk input{width:18px;height:18px;accent-color:var(--accent)}.muted{color:var(--muted)}.small{font-size:12px}.padwrap{aspect-ratio:1;border-radius:var(--radius-sm);border:1px solid var(--line);width:100%;box-shadow:var(--shadow);background:#fff;position:relative;overflow:hidden}.drawcanvas,.overlaycanvas{width:100%;height:100%;display:block;position:absolute;inset:0}.drawcanvas{touch-action:none;cursor:none}.drawcanvas.shape{cursor:crosshair}.overlaycanvas{pointer-events:none}.sizechip{pointer-events:none;background:color-mix(in srgb, var(--ink) 82%, transparent);color:#fff;font-variant-numeric:tabular-nums;opacity:0;border-radius:999px;padding:3px 8px;font-size:12px;font-weight:600;transition:opacity .15s;position:absolute;bottom:8px;left:8px}.sizechip.show{opacity:1}.toolgrp{grid-template-columns:repeat(4,1fr);gap:4px;margin:8px 0;display:grid}.toolgrp button{min-height:36px;padding:6px 2px;font-size:12px}.shapegrid{grid-template-columns:repeat(4,1fr);gap:4px;margin:6px 0;display:grid}.shapegrid button{flex-direction:column;align-items:center;gap:2px;min-height:52px;padding:6px 2px;font-size:11px;font-weight:600;display:flex}.shapegrid svg{width:22px;height:22px}.shapebox{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-sm);margin:8px 0;padding:10px}.shapebox .seg{background:var(--panel);margin:6px 0}.maskprev{object-fit:contain;border-radius:var(--radius-sm);border:1px solid var(--line);background:#fff;width:100%;max-height:260px;margin-top:6px}.filebtn{background:var(--accent-soft);color:var(--accent-hover);border:1px dashed var(--accent);border-radius:var(--radius-sm);cursor:pointer;padding:10px 14px;font-weight:600;display:inline-block}.filebtn input{display:none}.tracesvg{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;max-height:220px;margin-top:6px}.tracesvg path{fill:var(--accent-soft);stroke:var(--accent)}.p-preview{background:radial-gradient(circle at 50% 30%, var(--stage-2), var(--stage));flex-direction:column;padding:0;display:flex}.preview{flex:1;min-height:280px;position:relative}.viewport{position:absolute;inset:0}.viewbtns{gap:6px;display:flex;position:absolute;top:10px;left:10px}.viewbtns button{min-height:30px;color:var(--stage-ink);background:#ffffff1f;border-color:#ffffff40;padding:4px 10px;font-size:12px}.statline{color:var(--muted);border-top:1px solid var(--line);background:var(--card);padding:8px 12px;font-size:13px}.okc{color:var(--pass)}.badc{color:var(--fail)}.err{background:var(--fail-soft);color:var(--fail);border-top:1px solid #f3c4bf;padding:8px 12px;font-size:13px;font-weight:600}.exp{background:var(--card);margin:0;padding:0 12px 12px}.exp button{flex:1}.checks .badge{border-radius:var(--radius-sm);border:1px solid #0000;flex-direction:column;gap:2px;margin-bottom:10px;padding:12px 14px;font-weight:700;display:flex}.checks .badge small{opacity:.9;font-weight:500}.badge.pass{background:var(--pass-soft);color:#21472c;border-color:#bfd9c6}.badge.warn{background:var(--warn-soft);color:#6b3f10;border-color:#ead2b0}.badge.fail{background:var(--fail-soft);color:#7a1810;border-color:#f3c4bf}.checks ul{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.checks li{background:var(--card);border:1px solid var(--line);border-left:4px solid var(--line);border-radius:10px;gap:10px;padding:8px 10px;display:flex}.checks li.pass{border-left-color:var(--pass)}.checks li.warn{border-left-color:var(--warn)}.checks li.fail{border-left-color:var(--fail)}.checks li.info{border-left-color:var(--accent)}.checks .ic{text-align:center;width:18px;font-weight:700}li.pass .ic{color:var(--pass)}li.warn .ic{color:var(--warn)}li.fail .ic{color:var(--fail)}li.info .ic{color:var(--accent)}.checks .lbl{justify-content:space-between;gap:10px;font-size:14px;display:flex}.checks .val{font-variant-numeric:tabular-nums;text-align:right}.checks .det{color:var(--muted);margin-top:2px;font-size:12px}.checks h4{margin:16px 0 6px;font-size:13px}.wallmap{background:var(--stage);border-radius:var(--radius-sm);width:100%;image-rendering:pixelated}.sw{vertical-align:middle;border-radius:2px;width:10px;height:10px;display:inline-block}.sw.red{background:#ef4444}.sw.orange{background:#fb923c}@media (width<=1180px){main{grid-template-columns:300px 1fr 320px}.p-checks{border-top:1px solid var(--line);grid-column:1/-1}}@media (width<=860px){header h1 small{display:none}.tabs{border-bottom:1px solid var(--line);background:var(--card);display:flex}.tabs button{background:0 0;border:none;border-radius:0;flex:1;padding:10px 2px;font-size:13px;position:relative}.tabs button.on{color:var(--accent);border-bottom:3px solid var(--accent);background:0 0}.dot{border-radius:50%;width:8px;height:8px;position:absolute;top:6px;right:14%}.dot.pass{background:var(--pass)}.dot.warn{background:var(--warn)}.dot.fail{background:var(--fail)}main{display:block;overflow:hidden}.panel{border:none;height:100%;display:none}main[data-tab=input] .p-input,main[data-tab=customise] .p-custom,main[data-tab=checks] .p-checks{display:block}main[data-tab=preview] .p-preview{height:100%;display:flex}}
