:root{--bg:#0a0e1a;--bg-2:#111827;--bg-3:#1a2236;--bg-4:#243049;--border:#1f2a44;--border-2:#2d3a5a;--accent:#7dd3fc;--accent-2:#a5b4fc;--accent-strong:#60a5fa;--danger:#f87171;--warn:#fbbf24;--ok:#34d399;--text:#e6edf6;--text-2:#9aa6bd;--text-3:#4b5871;--serif:"Instrument Serif", Georgia, serif;--mono:"IBM Plex Mono", ui-monospace, monospace}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{font-family:var(--mono);background:var(--bg);color:var(--text);font-size:14px;line-height:1.55;overflow:hidden}button{font-family:inherit;font-size:inherit;cursor:pointer}input,textarea,select{font-family:inherit;font-size:inherit}a{color:inherit;text-decoration:none}.boot{display:grid;place-items:center;height:100%;color:var(--text-2);font-family:var(--serif);font-size:1.4rem}.login{display:grid;place-items:center;height:100%;background:radial-gradient(circle at 30% 30%,rgba(99,102,241,.1),transparent 50%),radial-gradient(circle at 70% 70%,rgba(125,211,252,.08),transparent 55%),var(--bg)}.login-card{width:min(380px,90vw);background:var(--bg-2);border:1px solid var(--border);border-radius:8px;padding:2rem;box-shadow:0 30px 60px -20px #00000080}.login-card h1{font-family:var(--serif);font-weight:400;font-size:1.8rem;margin-bottom:.4rem}.login-card .sub{color:var(--text-2);font-size:.85rem;margin-bottom:1.4rem}.login-card label{display:block;margin-bottom:1rem}.login-card label span{display:block;color:var(--text-2);font-size:.75rem;margin-bottom:.3rem;letter-spacing:.05em}.login-card input{width:100%;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:.6rem .8rem;color:var(--text);outline:none;transition:.2s}.login-card input:focus{border-color:var(--accent);box-shadow:0 0 0 3px #7dd3fc1f}.btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--accent);color:var(--bg);border:0;border-radius:4px;padding:.65rem 1.1rem;font-weight:500;transition:.2s}.btn:hover{filter:brightness(1.05)}.btn:disabled{opacity:.6;cursor:default}.btn.ghost{background:transparent;color:var(--text);border:1px solid var(--border)}.btn.ghost:hover{border-color:var(--accent);color:var(--accent)}.btn.danger{background:var(--danger);color:#fff}.btn.full{width:100%;justify-content:center}.err{color:var(--danger);font-size:.8rem;margin-bottom:1rem;background:#f871710f;border:1px solid rgba(248,113,113,.2);padding:.5rem .7rem;border-radius:4px}.topbar{display:flex;align-items:center;justify-content:space-between;height:50px;padding:0 1rem;background:var(--bg-2);border-bottom:1px solid var(--border);flex-shrink:0}.topbar .brand{font-family:var(--serif);font-size:1.2rem}.topbar .brand span{color:var(--accent)}.topbar .right{display:flex;align-items:center;gap:.8rem;color:var(--text-2);font-size:.8rem}.topbar .right .user{color:var(--text)}.topbar a.back{display:inline-flex;align-items:center;gap:.3rem;color:var(--text-2)}.topbar a.back:hover{color:var(--accent)}.dashboard{height:100%;display:flex;flex-direction:column}.dashboard .inner{flex:1;overflow:auto;padding:2.5rem 2rem;max-width:1200px;margin:0 auto;width:100%}.dashboard h2{font-family:var(--serif);font-weight:400;font-size:1.8rem;margin-bottom:1.5rem}.dashboard .new-project{display:flex;gap:.6rem;flex-wrap:wrap;margin-bottom:2rem;background:var(--bg-2);border:1px solid var(--border);border-radius:6px;padding:1rem}.dashboard .new-project input{flex:1;min-width:180px;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:.55rem .8rem;color:var(--text);outline:none}.dashboard .new-project input:focus{border-color:var(--accent)}.project-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1rem}.project-card{background:var(--bg-2);border:1px solid var(--border);border-radius:6px;padding:1.2rem;display:flex;flex-direction:column;transition:.2s;cursor:pointer;position:relative}.project-card:hover{border-color:var(--accent);background:var(--bg-3)}.project-card h3{font-family:var(--serif);font-weight:400;font-size:1.3rem;margin-bottom:.4rem}.project-card .desc{color:var(--text-2);font-size:.85rem;margin-bottom:1rem;min-height:2.4em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.project-card .meta{display:flex;justify-content:space-between;color:var(--text-3);font-size:.7rem;letter-spacing:.05em}.project-card .del{position:absolute;top:.6rem;right:.6rem;background:transparent;border:0;color:var(--text-3);padding:.3rem;border-radius:4px;opacity:0;transition:.2s}.project-card:hover .del{opacity:1}.project-card .del:hover{color:var(--danger);background:#f871711a}.empty{text-align:center;color:var(--text-2);padding:3rem 1rem;font-style:italic}.carto{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column}.carto>.topbar,.carto>.carto-actions{flex:none}.carto-body{flex:1 1 auto;min-height:0;display:flex;overflow:hidden}.carto-body>.toolbar{flex:0 0 64px}.carto-body>.props{flex:0 0 280px}.carto-body.no-left>.toolbar,.carto-body.no-right>.props{display:none}.carto-actions .iconbtn.ghost{background:transparent;border:1px solid transparent;color:var(--text-2);padding:.4rem;border-radius:4px}.carto-actions .iconbtn.ghost:hover{color:var(--accent);border-color:var(--border)}.objlist .objgroup{margin-top:.5rem}.objlist .objgroup-head{font-size:.65rem;letter-spacing:.08em;text-transform:uppercase;color:var(--text-3);padding:.3rem .1rem}.objlist .objrow{display:flex;align-items:center;gap:.45rem;width:100%;background:transparent;border:0;padding:.35rem .4rem;border-radius:4px;color:var(--text);font-family:inherit;font-size:.78rem;text-align:left;cursor:pointer;transition:.15s ease}.objlist .objrow:hover{background:var(--bg-4)}.objlist .objrow.active{background:var(--bg-4);color:var(--accent);box-shadow:inset 2px 0 0 var(--accent)}.objlist .objrow .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.objlist .objrow .name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.objlist .objrow .sub{color:var(--text-3);font-size:.65rem;letter-spacing:.04em;margin-left:.4rem}.carto-canvas-wrap{flex:1 1 auto;position:relative;background:var(--bg);overflow:hidden;min-width:0;min-height:0}.toolbar{background:var(--bg-2);border-right:1px solid var(--border);display:flex;flex-direction:column;gap:.3rem;padding:.5rem .35rem}.toolbar .tool-btn{width:46px;height:46px;background:transparent;border:1px solid transparent;border-radius:6px;color:var(--text-2);display:grid;place-items:center;transition:.15s;position:relative}.toolbar .tool-btn:hover{background:var(--bg-3);color:var(--text)}.toolbar .tool-btn.active{background:var(--bg-4);color:var(--accent);border-color:var(--accent)}.toolbar .tool-btn:hover:after{content:attr(data-label);position:absolute;left:calc(100% + 6px);top:50%;transform:translateY(-50%);background:var(--bg-3);border:1px solid var(--border-2);border-radius:4px;padding:.25rem .5rem;white-space:nowrap;font-size:.7rem;z-index:50;pointer-events:none}.toolbar .sep{height:1px;background:var(--border);margin:.3rem 0}.props{background:var(--bg-2);border-left:1px solid var(--border);overflow-y:auto;padding:1rem;display:flex;flex-direction:column;gap:1rem}.props h3{font-family:var(--serif);font-weight:400;font-size:1.1rem;display:flex;align-items:center;gap:.4rem}.props .section{background:var(--bg-3);border:1px solid var(--border);border-radius:6px;padding:.8rem}.props .section h4{font-size:.7rem;letter-spacing:.08em;color:var(--text-2);text-transform:uppercase;margin-bottom:.6rem;font-weight:600}.field{margin-bottom:.6rem}.field:last-child{margin-bottom:0}.field label{display:block;color:var(--text-2);font-size:.7rem;margin-bottom:.25rem;letter-spacing:.04em}.field input,.field select,.field textarea{width:100%;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:.45rem .6rem;color:var(--text);outline:none;font-size:.85rem}.field textarea{resize:vertical;min-height:60px}.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--accent)}.field-row{display:flex;gap:.4rem}.field-row>*{flex:1}.range-field{display:flex;align-items:center;gap:.6rem}.range-field input[type=range]{flex:1}.range-field .val{color:var(--text-2);font-size:.75rem;min-width:30px;text-align:right}.layers .layer{display:flex;align-items:center;justify-content:space-between;padding:.35rem .5rem;border-radius:4px;font-size:.8rem}.layers .layer:hover{background:var(--bg-4)}.layers .layer .name{display:flex;align-items:center;gap:.4rem;color:var(--text-2)}.layers .layer.on .name{color:var(--text)}.layers .layer button.eye{background:transparent;border:0;color:var(--text-3);padding:0;width:22px;height:22px;display:grid;place-items:center;border-radius:3px}.layers .layer.on button.eye{color:var(--accent)}.carto-actions{display:flex;align-items:center;gap:.4rem;padding:0 1rem;height:50px;background:var(--bg-2);border-bottom:1px solid var(--border);flex-shrink:0}.carto-actions .title{font-family:var(--serif);font-size:1.2rem;margin-right:auto;display:flex;align-items:center;gap:.6rem}.carto-actions .title input{background:transparent;border:0;color:var(--text);font:inherit;outline:none;border-bottom:1px solid transparent;padding:.1rem 0;min-width:200px}.carto-actions .title input:focus,.carto-actions .title input:hover{border-bottom-color:var(--border-2)}.carto-actions .save-state{font-size:.7rem;color:var(--text-3)}.carto-actions .save-state.unsaved{color:var(--warn)}.carto-actions .save-state.saved{color:var(--ok)}.minimap{position:absolute;right:12px;bottom:12px;width:180px;height:135px;background:#0a0e1ad9;border:1px solid var(--border-2);border-radius:4px;overflow:hidden;z-index:10;pointer-events:none}.minimap canvas{width:100%;height:100%}.minimap .viewport{position:absolute;border:2px solid var(--accent);background:#7dd3fc1a;pointer-events:none}.zoomhud{position:absolute;left:12px;bottom:12px;background:#0a0e1ab3;border:1px solid var(--border);border-radius:4px;padding:.3rem .6rem;font-size:.7rem;color:var(--text-2);pointer-events:none}.color-row{display:flex;gap:.3rem;flex-wrap:wrap}.color-swatch{width:24px;height:24px;border-radius:50%;border:2px solid transparent;cursor:pointer;transition:.15s}.color-swatch:hover{transform:scale(1.1)}.color-swatch.active{border-color:#fff;box-shadow:0 0 0 2px var(--bg-3)}.terrain-palette{display:grid;grid-template-columns:repeat(2,1fr);gap:.4rem;margin-top:.5rem}.terrain-palette .swatch{display:flex;align-items:center;gap:.4rem;padding:.4rem .5rem;border:1px solid var(--border);border-radius:4px;background:var(--bg);cursor:pointer;font-size:.75rem;color:var(--text-2);transition:.15s}.terrain-palette .swatch:hover{border-color:var(--border-2);color:var(--text)}.terrain-palette .swatch.active{border-color:var(--accent);color:var(--accent);background:var(--bg-3)}.terrain-palette .swatch .dot{width:16px;height:16px;border-radius:3px;flex-shrink:0}.iconbtn{background:transparent;border:1px solid var(--border);color:var(--text-2);padding:.4rem .6rem;border-radius:4px;display:inline-flex;align-items:center;gap:.4rem;font-size:.75rem;transition:.15s}.iconbtn:hover{border-color:var(--accent);color:var(--accent)}.iconbtn.danger:hover{border-color:var(--danger);color:var(--danger)}.toolbar::-webkit-scrollbar,.props::-webkit-scrollbar,.dashboard .inner::-webkit-scrollbar{width:8px}.toolbar::-webkit-scrollbar-thumb,.props::-webkit-scrollbar-thumb,.dashboard .inner::-webkit-scrollbar-thumb{background:var(--border-2);border-radius:4px}.toolbar::-webkit-scrollbar-track,.props::-webkit-scrollbar-track,.dashboard .inner::-webkit-scrollbar-track{background:transparent}.tg-boot{position:fixed;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;color:var(--text-2);font-family:var(--mono);font-size:.95rem;background:var(--bg);padding:2rem}.tg-boot.err{color:var(--danger)}.tg,.tg-carto{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;background:var(--bg);color:var(--text);font-family:var(--mono);padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom)}.tg-top{display:flex;align-items:center;gap:.6rem;padding:.7rem .8rem;background:var(--bg-2);border-bottom:1px solid var(--border);flex-shrink:0}.tg-top .brand{font-family:var(--serif);font-size:1.3rem}.tg-top .brand span{color:var(--accent)}.tg-top .who{margin-left:auto;color:var(--text-2);font-size:.78rem}.tg-top .title-input{flex:1;min-width:0;background:transparent;border:0;font-family:var(--serif);font-size:1.1rem;color:var(--text);padding:.2rem .3rem;outline:none;border-bottom:1px solid transparent}.tg-top .title-input:focus{border-bottom-color:var(--border-2)}.tg-top .iconbtn{width:38px;height:38px;display:grid;place-items:center;background:var(--bg-3);border:1px solid var(--border);border-radius:8px;color:var(--text)}.tg-top .iconbtn.ghost{background:transparent;border-color:transparent;color:var(--text-2)}.tg-top .iconbtn.primary{background:var(--accent);color:var(--bg);border-color:var(--accent)}.tg-top .iconbtn:disabled{opacity:.5}.tg-list{flex:1;overflow-y:auto;padding:.8rem;display:flex;flex-direction:column;gap:.6rem;-webkit-overflow-scrolling:touch}.tg-card{background:var(--bg-2);border:1px solid var(--border);border-radius:10px;padding:.9rem 1rem;display:flex;flex-direction:column;gap:.3rem}.tg-card:active{background:var(--bg-3)}.tg-card-row{display:flex;align-items:center;gap:.6rem}.tg-card .title{flex:1;font-family:var(--serif);font-size:1.15rem}.tg-card .del{background:transparent;border:0;color:var(--text-3);width:32px;height:32px;display:grid;place-items:center;border-radius:6px}.tg-card .del:active{color:var(--danger);background:#f871711a}.tg-card .desc{color:var(--text-2);font-size:.82rem}.tg-card .meta{color:var(--text-3);font-size:.7rem;letter-spacing:.04em}.empty{color:var(--text-2);text-align:center;padding:3rem 1rem}.tg-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:80;animation:tg-fade .15s ease}.tg-sheet{position:fixed;left:0;right:0;bottom:0;z-index:81;background:var(--bg-2);border-top:1px solid var(--border-2);border-radius:18px 18px 0 0;padding:.4rem 1rem 1.4rem;padding-bottom:calc(1.4rem + env(safe-area-inset-bottom));display:flex;flex-direction:column;gap:.7rem;max-height:80vh;animation:tg-slide .2s ease;box-shadow:0 -20px 50px #0006}.tg-sheet.tg-sheet-large{max-height:85vh}.tg-sheet.compact{max-height:60vh}.tg-sheet .grip{width:42px;height:4px;border-radius:99px;background:var(--border-2);margin:.3rem auto .6rem}.tg-sheet h3{font-family:var(--serif);font-weight:400;font-size:1.25rem}.tg-sheet input,.tg-sheet textarea,.tg-sheet select{width:100%;background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:.7rem .9rem;color:var(--text);outline:none;font-size:16px}.tg-sheet textarea{min-height:80px;resize:vertical}.tg-sheet input:focus,.tg-sheet textarea:focus,.tg-sheet select:focus{border-color:var(--accent)}.tg-sheet .row{display:flex;gap:.6rem;margin-top:.4rem}.tg-sheet .row>*{flex:1}.tg-sheet .ghost,.tg-sheet .primary{padding:.8rem 1rem;border-radius:8px;font-size:.95rem;display:inline-flex;align-items:center;justify-content:center;gap:.4rem;font-family:inherit}.tg-sheet .ghost{background:transparent;border:1px solid var(--border);color:var(--text)}.tg-sheet .primary{background:var(--accent);color:var(--bg);border:0;font-weight:500}.tg-sheet .primary:disabled{opacity:.5}.tg-sheet .sheet-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:.4rem}.tg-sheet .sheet-head .iconbtn{width:32px;height:32px;border:0;background:transparent;color:var(--text-2);font-size:1.4rem;line-height:1;border-radius:8px}.tg-sheet .sheet-body{overflow-y:auto;-webkit-overflow-scrolling:touch}.tg-sheet .props{background:transparent;border:0;padding:0;overflow:visible}.tg-canvas-wrap{flex:1 1 auto;position:relative;background:var(--bg);overflow:hidden;min-height:0;touch-action:none}.tg-fab-col{position:absolute;top:10px;right:10px;display:flex;flex-direction:column;gap:.4rem;z-index:20}.tg-fab-col .fab{width:42px;height:42px;background:var(--bg-2);border:1px solid var(--border-2);border-radius:50%;color:var(--text);display:grid;place-items:center;box-shadow:0 2px 10px #0000004d}.tg-fab-col .fab:active{background:var(--bg-3)}.tg-fab-col .fab:disabled{opacity:.4}.tg-toolbar{display:flex;gap:.35rem;overflow-x:auto;overflow-y:hidden;padding:.55rem .6rem;padding-bottom:calc(.55rem + env(safe-area-inset-bottom));background:var(--bg-2);border-top:1px solid var(--border);flex-shrink:0;scrollbar-width:none;-ms-overflow-style:none}.tg-toolbar::-webkit-scrollbar{display:none}.tg-toolbar .tool{flex:0 0 64px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.2rem;height:60px;background:transparent;border:1px solid transparent;border-radius:10px;color:var(--text-2);font-size:.65rem;letter-spacing:.02em;font-family:inherit}.tg-toolbar .tool:active{background:var(--bg-3)}.tg-toolbar .tool.active{background:var(--bg-4);border-color:var(--accent);color:var(--accent)}.tg-layers{display:flex;flex-direction:column;gap:.4rem}.tg-layers .layer{display:flex;align-items:center;gap:.7rem;padding:.7rem .9rem;border:1px solid var(--border);border-radius:8px;background:var(--bg);color:var(--text-2);font-family:inherit;font-size:.9rem;text-align:left}.tg-layers .layer.on{color:var(--text);border-color:var(--border-2)}.tg-layers .layer .dot{width:10px;height:10px;border-radius:50%;background:var(--accent)}@keyframes tg-fade{0%{opacity:0}to{opacity:1}}@keyframes tg-slide{0%{transform:translateY(100%)}to{transform:translateY(0)}}
