:root{
  --bg:#0f241a;--panel:#10261d;--panel2:#163326;--line:#2c5942;--text:#f5f7f5;--muted:#a9c0b1;
  --accent:#7ee2a8;--accent2:#c9f7d9;--warn:#ffd88a;--danger:#ff9f9f;--shadow:0 18px 50px rgba(0,0,0,.34);
  --safe-top:env(safe-area-inset-top,0px);--safe-bottom:env(safe-area-inset-bottom,0px)
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;width:100%;height:100%;overflow:hidden;background:var(--bg);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
button,input,textarea{font:inherit}button{color:inherit}
#app{position:fixed;inset:0;overflow:hidden;background:#193f2b}
#mapViewport{position:absolute;inset:0;overflow:hidden;touch-action:none;cursor:grab;background:radial-gradient(circle at 50% 45%,rgba(126,226,168,.08),transparent 28%),linear-gradient(#1d4c32,#193f2b)}
#mapViewport.dragging{cursor:grabbing}
#world{position:absolute;left:0;top:0;width:10000px;height:10000px;transform-origin:0 0;will-change:transform;background:
  linear-gradient(30deg,rgba(255,255,255,.025) 12%,transparent 12.5%,transparent 87%,rgba(255,255,255,.025) 87.5%,rgba(255,255,255,.025)),
  linear-gradient(150deg,rgba(255,255,255,.025) 12%,transparent 12.5%,transparent 87%,rgba(255,255,255,.025) 87.5%,rgba(255,255,255,.025)),
  linear-gradient(30deg,rgba(255,255,255,.025) 12%,transparent 12.5%,transparent 87%,rgba(255,255,255,.025) 87.5%,rgba(255,255,255,.025)),
  linear-gradient(150deg,rgba(255,255,255,.025) 12%,transparent 12.5%,transparent 87%,rgba(255,255,255,.025) 87.5%,rgba(255,255,255,.025)),
  linear-gradient(60deg,rgba(0,0,0,.035) 25%,transparent 25.5%,transparent 75%,rgba(0,0,0,.035) 75%,rgba(0,0,0,.035));
  background-size:80px 140px;background-position:0 0,0 0,40px 70px,40px 70px,0 0}
.grass-noise{position:absolute;inset:0;pointer-events:none;opacity:.22;background-image:radial-gradient(rgba(255,255,255,.22) .6px,transparent .7px);background-size:23px 23px}
.topbar{position:absolute;left:12px;right:12px;top:calc(10px + var(--safe-top));z-index:50;display:flex;align-items:flex-start;gap:8px;pointer-events:none}
.brand{pointer-events:auto;background:rgba(10,28,19,.88);backdrop-filter:blur(12px);border:1px solid rgba(164,226,188,.18);border-radius:16px;padding:10px 12px;box-shadow:var(--shadow);min-width:0}
.brand h1{font-size:15px;margin:0 0 2px;font-weight:800}.brand p{font-size:11px;margin:0;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:190px}
.top-actions{margin-left:auto;display:flex;gap:7px;pointer-events:auto}.iconbtn{width:42px;height:42px;border-radius:14px;border:1px solid rgba(164,226,188,.18);background:rgba(10,28,19,.88);backdrop-filter:blur(12px);display:grid;place-items:center;font-size:18px;box-shadow:var(--shadow);padding:0}
.hint{position:absolute;left:50%;transform:translateX(-50%);bottom:calc(14px + var(--safe-bottom));z-index:30;background:rgba(10,28,19,.82);border:1px solid rgba(164,226,188,.14);padding:8px 11px;border-radius:999px;font-size:11px;color:var(--muted);pointer-events:none;transition:.25s;white-space:nowrap}
.resume-pill{position:absolute;left:12px;right:12px;bottom:calc(52px + var(--safe-bottom));z-index:45;border:1px solid rgba(126,226,168,.35);background:rgba(12,33,23,.94);box-shadow:var(--shadow);border-radius:14px;padding:10px 12px;display:none;align-items:center;gap:10px;text-align:left}.resume-pill.show{display:flex}.resume-pill strong{display:block;font-size:12px}.resume-pill small{display:block;color:var(--muted);font-size:10px;margin-top:2px}.resume-pill .go{margin-left:auto;font-size:18px}
.district-zone{position:absolute;transform:translate(-50%,-50%) rotate(-2deg);border:2px solid rgba(255,255,255,.11);box-shadow:inset 0 0 55px rgba(0,0,0,.12),0 20px 50px rgba(0,0,0,.12);pointer-events:none;opacity:.9;z-index:1;overflow:hidden}
.district-zone:after{content:"";position:absolute;inset:0;background-image:radial-gradient(rgba(255,255,255,.15) .7px,transparent .8px),linear-gradient(35deg,transparent 45%,rgba(255,255,255,.04) 46%,transparent 48%);background-size:24px 24px,70px 70px;opacity:.32}
.place{position:absolute;transform:translate(-50%,-50%);width:180px;height:160px;display:flex;align-items:flex-end;justify-content:center;cursor:pointer;user-select:none;filter:drop-shadow(0 16px 18px rgba(0,0,0,.22));z-index:4}
.place .level{position:absolute;top:0;left:50%;transform:translateX(-50%);z-index:7;background:#10261d;border:1px solid rgba(126,226,168,.35);padding:4px 8px;border-radius:999px;font-size:11px;font-weight:800;white-space:nowrap}.place .name{position:absolute;bottom:-14px;left:50%;transform:translateX(-50%);z-index:9;background:rgba(10,28,19,.94);border:1px solid rgba(164,226,188,.22);padding:5px 9px;border-radius:9px;font-size:11px;font-weight:800;white-space:nowrap;max-width:190px;overflow:hidden;text-overflow:ellipsis}
.tile{position:absolute;left:50%;bottom:12px;width:126px;height:72px;transform:translateX(-50%) rotate(30deg) skewY(-30deg) scaleY(.86);border-radius:10px;background:#29593c;border:1px solid rgba(255,255,255,.12);box-shadow:inset 0 0 0 8px rgba(255,255,255,.025)}
.building{position:absolute;bottom:48px;left:50%;transform:translateX(-50%);width:74px;height:60px;z-index:3}.building .front{position:absolute;left:8px;top:20px;width:58px;height:46px;background:#d9cab4;border:2px solid #3d4a43;border-top:none;border-radius:2px 2px 6px 6px}.building .roof{position:absolute;left:7px;top:2px;width:60px;height:42px;background:#61796e;border:2px solid #36483f;transform:skewY(-22deg);border-radius:5px 5px 2px 2px}.building .door{position:absolute;left:31px;top:42px;width:15px;height:24px;background:#6b5142;border-radius:3px 3px 0 0;z-index:5}.building .win{position:absolute;top:35px;width:10px;height:11px;background:#b8e6d7;border:2px solid #5f756b;z-index:5}.building .w1{left:15px}.building .w2{right:15px}
.place.town .building{width:94px;height:88px;bottom:43px}.place.town .building .front{left:7px;top:28px;width:80px;height:58px;background:#e3d4b5}.place.town .building .roof{left:4px;top:4px;width:86px;height:50px;background:#506b60}.place.town .tower{position:absolute;left:34px;top:-15px;width:25px;height:51px;background:#d8c7a7;border:2px solid #40534a;z-index:4}.place.town .tower:before{content:"";position:absolute;left:-7px;top:-16px;border-left:18px solid transparent;border-right:18px solid transparent;border-bottom:18px solid #4b6459}.place.town .clock{position:absolute;width:11px;height:11px;border-radius:50%;background:#dff2e8;border:2px solid #41554b;left:5px;top:10px}.place.town .building .door{left:39px;top:56px}.place.main .building .front{background:#cbd8cd}.place.main .building .roof{background:#447760}.place.normal .building .front{background:#d6c9ac}.place.normal .building .roof{background:#8b7651}
.sheet-backdrop{position:absolute;inset:0;z-index:80;background:rgba(0,0,0,.46);opacity:0;pointer-events:none;transition:.2s}.sheet-backdrop.open{opacity:1;pointer-events:auto}.sheet{position:absolute;z-index:90;left:0;right:0;bottom:0;max-height:min(88vh,850px);background:linear-gradient(180deg,#153226,#0e241a);border-radius:24px 24px 0 0;border:1px solid rgba(164,226,188,.16);box-shadow:0 -20px 60px rgba(0,0,0,.4);transform:translateY(105%);transition:.28s cubic-bezier(.2,.8,.2,1);padding:10px 16px calc(18px + var(--safe-bottom));overflow:auto;overscroll-behavior:contain}.sheet.open{transform:translateY(0)}
.handle{width:42px;height:4px;border-radius:10px;background:#557463;margin:2px auto 14px}.sheet-head{display:flex;gap:10px;align-items:flex-start;margin-bottom:14px}.sheet-title{flex:1}.sheet-title h2{font-size:20px;margin:0 0 4px}.sheet-title p{font-size:12px;margin:0;color:var(--muted);line-height:1.45}.closebtn{width:36px;height:36px;border-radius:12px;border:1px solid var(--line);background:#173426;font-size:18px}
.card{background:rgba(255,255,255,.035);border:1px solid rgba(164,226,188,.14);border-radius:16px;padding:13px;margin:10px 0}.card h3{font-size:14px;margin:0 0 7px}.card p{font-size:13px;line-height:1.48;margin:5px 0;color:#dce7df}.muted{color:var(--muted)!important}.deleted-book-notice{color:#ff7777!important;font-weight:700}.tiny{font-size:11px!important}.status{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:5px 8px;font-size:10px;font-weight:800;border:1px solid rgba(126,226,168,.2);background:#173c2a;color:#b9f4cf}.status.warn{background:#3a2f1c;color:#ffe3a9;border-color:#6c572c}
.actions{display:grid;gap:9px;margin-top:12px}.btn{width:100%;border:0;border-radius:14px;padding:13px 14px;font-weight:800;background:#244936;text-align:left}.btn.primary{background:var(--accent);color:#0b2b1a}.btn.secondary{background:#1a3b2c;border:1px solid #356148}.btn.ghost{background:transparent;border:1px solid #355945}.btn.danger{background:#452326;color:#ffd2d2}.btn:disabled{opacity:.42}
.field{display:grid;gap:6px;margin:10px 0}.field label{font-size:12px;color:var(--muted)}.field input,.field textarea{width:100%;border:1px solid #345c46;background:#0e2118;color:var(--text);border-radius:13px;padding:12px;outline:none}.field textarea{min-height:92px;resize:vertical;line-height:1.45}.field input:focus,.field textarea:focus{border-color:#78c99a;box-shadow:0 0 0 3px rgba(126,226,168,.08)}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin:10px 0}.chip{border:1px solid #3a634c;background:#173426;border-radius:999px;padding:7px 10px;font-size:11px}.source-link{display:flex;align-items:center;justify-content:space-between;gap:10px;border:1px solid #426b53;border-radius:14px;padding:12px;text-decoration:none;color:#e9fff1;background:#173829}.source-link span:first-child{min-width:0}.source-link strong{display:block;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.source-link small{display:block;color:var(--muted);margin-top:3px}.arrow{font-size:18px}
.progress{display:flex;gap:6px;margin:12px 0}.dot{height:5px;flex:1;border-radius:5px;background:#2d4c3c}.dot.on{background:var(--accent)}.qnum{font-size:10px;font-weight:900;color:#98dcb2;text-transform:uppercase;letter-spacing:.08em}.question{font-size:15px;font-weight:750;line-height:1.4;margin:5px 0 8px}.hidden-tag{display:inline-block;font-size:10px;font-weight:900;color:#ffe1a0;border:1px solid #6c572c;background:#3a2f1c;padding:4px 7px;border-radius:999px;margin-bottom:8px}.eval{border-left:3px solid #5da77a;padding-left:10px;margin:12px 0}.eval.partial{border-color:#d1a94c}.eval.bad{border-color:#c26666}.eval strong{font-size:13px}.eval p{font-size:12px;margin:4px 0;color:#dbe9df}.brick{border:1px solid #49644f;background:#182d22;border-radius:12px;padding:10px 11px;margin:7px 0;font-size:12px;line-height:1.4}.note-list{display:grid;gap:8px}.note-row{width:100%;padding:12px;border:1px solid #355945;border-radius:13px;background:#142e22;text-align:left}.note-row strong{font-size:13px}.note-row small{display:block;color:var(--muted);margin-top:4px}.notice{font-size:11px;line-height:1.45;border-radius:12px;padding:10px;background:#2f2b1b;border:1px solid #665a2b;color:#ffe9b2;margin:8px 0}
.map-mini{position:relative;height:205px;border:1px solid #355945;border-radius:16px;background:radial-gradient(circle at 50% 50%,rgba(126,226,168,.08),transparent 45%),#11291d;overflow:hidden;margin:10px 0}.map-mini:before{content:"";position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,.025) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.025) 1px,transparent 1px);background-size:28px 28px}.map-dot{position:absolute;transform:translate(-50%,-50%);border:1px solid rgba(255,255,255,.28);box-shadow:0 4px 12px rgba(0,0,0,.3);border-radius:50%;width:24px;height:24px;padding:0;font-size:10px;z-index:2}.map-dot.town{width:30px;height:30px;background:#d3bd83;color:#142317}.map-dot-label{position:absolute;transform:translate(-50%,13px);font-size:9px;white-space:nowrap;background:rgba(8,20,14,.8);padding:2px 5px;border-radius:5px;pointer-events:none;max-width:90px;overflow:hidden;text-overflow:ellipsis}.district-key{display:flex;align-items:center;gap:8px}.swatch{width:12px;height:12px;border-radius:4px;border:1px solid rgba(255,255,255,.2);flex:0 0 auto}
.toast{position:absolute;left:50%;top:calc(74px + var(--safe-top));transform:translate(-50%,-12px);z-index:120;opacity:0;pointer-events:none;background:#0c2117;border:1px solid #3c694f;border-radius:12px;padding:10px 12px;font-size:12px;box-shadow:var(--shadow);transition:.2s;max-width:calc(100vw - 28px);text-align:center}.toast.show{opacity:1;transform:translate(-50%,0)}
@media (max-width:430px){.brand p{max-width:135px}.top-actions{gap:5px}.iconbtn{width:39px;height:39px;border-radius:13px}.topbar{left:9px;right:9px}.brand{padding:9px 10px}.brand h1{font-size:14px}}
@media (min-width:760px){.sheet{left:50%;right:auto;width:min(640px,calc(100vw - 40px));transform:translate(-50%,105%);border-radius:24px 24px 0 0}.sheet.open{transform:translate(-50%,0)}.topbar{left:20px;right:20px}.brand h1{font-size:16px}.hint{bottom:20px}.resume-pill{left:50%;right:auto;width:540px;transform:translateX(-50%)}}

.library-tree{font-size:13px;line-height:1.7}.library-tree>strong{display:block;margin-bottom:8px}.library-section{padding:7px 0;border-top:1px solid rgba(164,226,188,.12)}.library-section>span,.library-rack>span{float:right;color:var(--muted);font-size:11px}.library-rack{margin-left:12px;padding:5px 0}.library-shelf{margin-left:14px;color:#dce7df;font-size:12px}.library-shelf small{color:var(--muted);margin-left:4px}.validation-row{padding:9px;border-radius:10px;margin:7px 0;background:#153226;border:1px solid #355945}.validation-row small{display:block;color:var(--muted);margin-top:4px;line-height:1.4}.validation-row.invalid,.validation-error{color:#ffd0d0;border-color:#774747}.validation-row.valid{border-color:#3b7654}.validation-error{padding:10px;background:#3b2525;border:1px solid;border-radius:10px;line-height:1.4}
.library-level{border-top:1px solid rgba(164,226,188,.12);padding:5px 0}.library-level summary,.library-book summary{cursor:pointer;min-height:42px;padding:10px 8px;border-radius:10px;list-style-position:inside;touch-action:manipulation}.library-level summary:hover,.library-book summary:hover{background:rgba(126,226,168,.07)}.library-level summary small{float:right;color:var(--muted);font-size:11px}.library-level.rack{margin-left:8px}.library-level.shelf{margin-left:16px}.library-book{margin:5px 0 5px 22px;border:1px solid rgba(164,226,188,.14);border-radius:12px}.library-book summary{font-weight:750}.library-book-detail{padding:0 10px 12px}.library-book-detail h4{margin:14px 0 6px;font-size:12px}.library-book-detail .eval{margin-left:4px}.library-book-detail .btn.danger{margin-top:10px}

@media (max-width:360px){.top-actions{gap:4px}.iconbtn{width:34px;height:36px}.brand{padding:8px}.brand h1{font-size:12px}.brand p{max-width:112px;font-size:10px}}
