:root{--font: "Zen Maru Gothic", "PingFang TC", "Noto Sans TC", sans-serif;--latin: "Montserrat", var(--font);--ink: #5a4434;--soft: #8a7462;--paper: #fffaf2;--line: #efd9ae;--accent: #ee9fae;--accent-deep: #e07386}*{box-sizing:border-box}html,body{margin:0;height:100%;overflow:hidden;background:#d7eef7}body{font-family:var(--font);color:var(--ink);-webkit-tap-highlight-color:transparent}#scene{position:fixed;inset:0;width:100%;height:100%;display:block;touch-action:none}.brand{position:fixed;top:max(16px,env(safe-area-inset-top));left:16px;padding:10px 16px 9px;border-radius:18px;background:#fffaf2db;backdrop-filter:blur(6px);box-shadow:0 4px 0 var(--line);pointer-events:none}.brand h1{margin:0;font-size:20px;letter-spacing:.12em}.brand p{margin:2px 0 0;font:600 10px var(--latin);letter-spacing:.22em;color:var(--soft)}.controls{position:fixed;top:max(16px,env(safe-area-inset-top));right:16px;display:flex;gap:8px;align-items:center}.seg{display:flex;gap:2px;padding:4px;border-radius:18px;background:#fffaf2db;backdrop-filter:blur(6px);box-shadow:0 4px 0 var(--line)}.seg button{display:flex;align-items:center;gap:5px;padding:7px 11px 7px 9px;border:0;border-radius:14px;background:transparent;font:700 13px var(--font);letter-spacing:.06em;color:var(--soft);cursor:pointer;transition:background .2s,color .2s}.seg button:hover{background:#efd9ae73;color:var(--ink)}.seg button[aria-pressed=true]{background:var(--ink);color:var(--paper)}.seg button:focus-visible{outline:2px solid var(--accent-deep);outline-offset:1px}.seg svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}.hint{position:fixed;left:50%;bottom:max(24px,env(safe-area-inset-bottom));transform:translate(-50%,12px);opacity:0;padding:10px 18px;border-radius:999px;background:#5a4434c7;color:#fff;font-size:14px;letter-spacing:.06em;white-space:nowrap;pointer-events:none;transition:opacity .4s,transform .4s}.hint.show{opacity:1;transform:translate(-50%)}.tag{position:fixed;left:0;top:0;padding:6px 12px;border-radius:12px;background:var(--paper);box-shadow:0 3px 0 var(--line);font-weight:700;font-size:14px;pointer-events:none;opacity:0;transition:opacity .15s}.tag.show{opacity:1}#bubbles{position:fixed;inset:0;pointer-events:none}.bubble{position:absolute;left:0;top:0;padding:8px 14px;border-radius:16px;background:#fff;box-shadow:0 3px 0 var(--line);font-size:14px;font-weight:700;white-space:nowrap;opacity:0;transition:opacity .25s}.bubble:after{content:"";position:absolute;left:50%;bottom:-7px;margin-left:-7px;border:7px solid transparent;border-bottom:0;border-top-color:#fff}.bubble.show{opacity:1}.card{position:fixed;right:32px;top:50%;width:320px;transform:translate(24px,-50%);opacity:0;padding:22px 22px 18px;border-radius:26px;background:var(--paper);box-shadow:0 6px 0 var(--line),0 18px 40px #5a44342e;transition:opacity .3s,transform .3s}.card.show{opacity:1;transform:translateY(-50%)}.card .chip{display:inline-block;padding:3px 10px;border-radius:999px;font-size:12px;font-weight:700;background:#d8f0dd;color:#3f8a57}.card[data-status=building] .chip{background:#ece2f8;color:#6b4f9a}.card[data-status=soon] .chip{background:#e6f4d9;color:#5f7f45}.card[data-status=vacant] .chip{background:#f6ead6;color:#8a6a4a}.card h2{margin:12px 0 0;font-size:24px;letter-spacing:.06em}.card .en{margin:2px 0 0;font:600 11px var(--latin);letter-spacing:.2em;text-transform:uppercase;color:var(--soft)}.card .owner{margin:10px 0 0;font-size:13px;color:var(--soft)}.card .owner:empty{display:none}.card .blurb{margin:10px 0 0;font-size:15px;line-height:1.7}.card .actions{display:flex;gap:8px;margin-top:18px}.card button{flex:1;padding:12px 10px;border-radius:16px;border:0;cursor:pointer;font:700 15px var(--font);letter-spacing:.08em;color:var(--ink);transition:transform .12s,box-shadow .12s}.card .primary{background:var(--accent);color:#fff;box-shadow:0 4px 0 var(--accent-deep)}.card .primary:active:not(:disabled){transform:translateY(3px);box-shadow:0 1px 0 var(--accent-deep)}.card .primary:disabled{background:#e8ddd0;color:#a8937f;box-shadow:0 4px #d8c9b6;cursor:default}.card .ghost{background:#f3e8d6;box-shadow:0 4px #e2cfae;flex:0 0 auto;padding-inline:16px}.card .ghost:active{transform:translateY(3px);box-shadow:0 1px #e2cfae}@media(max-width:640px){.card{left:12px;right:12px;top:auto;bottom:max(12px,env(safe-area-inset-bottom));width:auto;transform:translateY(24px)}.card.show{transform:translateY(0)}.brand h1{font-size:17px}}@media(max-width:900px){.seg button span{display:none}.seg button{padding:7px}}@media(max-width:480px){.controls{flex-direction:column;align-items:flex-end;gap:6px}}.fade{position:fixed;inset:0;background:var(--paper);opacity:0;pointer-events:none;transition:opacity .4s}.fade.on{opacity:1;pointer-events:auto}.loader{position:fixed;inset:0;display:grid;place-items:center;background:var(--paper);font-size:16px;letter-spacing:.2em;color:var(--soft);transition:opacity .6s}body.ready .loader{opacity:0;pointer-events:none}.map-dock{position:fixed;left:16px;bottom:max(16px,env(safe-area-inset-bottom));display:flex;flex-direction:column;align-items:flex-start;gap:8px;width:min(300px,calc(100vw - 32px));pointer-events:none}.map-dock>*{pointer-events:auto}.map{width:100%;padding:6px;border-radius:22px;background:var(--paper);box-shadow:0 5px 0 var(--line),0 14px 30px #5a443429}.map[hidden]{display:none}.map-frame{position:relative;border-radius:16px;overflow:hidden;background:#86d5c9;cursor:crosshair}.map-frame canvas{position:absolute;inset:0;width:100%;height:100%;display:block}.map-pins{position:absolute;pointer-events:none}.map-house,.map-mark{position:absolute;width:22px;height:22px;padding:0;transform:translate(-50%,-62%);display:grid;place-items:center}.map-house{border:0;background:none;cursor:pointer;pointer-events:auto;--c: #f5b335;--d: #fff6e4;transition:transform .15s}.map-house[data-status=building]{--c: #a98bd6}.map-house[data-status=soon]{--c: #7fbf66}.map-house[data-status=vacant]{--c: rgba(255, 250, 242, .55);--d: #b39472}.map-house svg{width:22px;height:22px;overflow:visible;filter:drop-shadow(0 1.5px 0 rgba(90,68,52,.35))}.map-house .body{fill:var(--c);stroke:#fff;stroke-width:1.6;stroke-linejoin:round}.map-house .door{fill:none;stroke:var(--d);stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.map-house[data-status=vacant] .body{stroke:#b39472;stroke-dasharray:2.4 2}.map-house .crown{fill:#6fb86a;stroke:#fff;stroke-width:1.6;stroke-linejoin:round}.map-house .trunk{fill:#b07a50;stroke:#fff;stroke-width:1.6;stroke-linejoin:round}.map-house .hole{fill:#5a4434}.map-house:hover,.map-house:focus-visible{transform:translate(-50%,-62%) scale(1.2);outline:none;z-index:2}.map-house:after{content:attr(data-name);position:absolute;left:50%;bottom:calc(100% + 3px);transform:translate(-50%);padding:3px 8px;border-radius:9px;background:var(--paper);box-shadow:0 2px 0 var(--line);font:700 11px var(--font);color:var(--ink);white-space:nowrap;opacity:0;transition:opacity .15s;pointer-events:none}.map-house:hover:after,.map-house:focus-visible:after{opacity:1}.map-mark{width:20px;height:20px;border-radius:50%;transform:translate(-50%,-50%);background:#463c40d1;border:1.5px solid #fff}.map-mark svg{width:14px;height:14px;fill:none;stroke:#fff;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.map-toggle{display:flex;align-items:center;gap:6px;padding:9px 14px 9px 11px;border:0;border-radius:18px;background:#fffaf2db;backdrop-filter:blur(6px);box-shadow:0 4px 0 var(--line);font:700 13px var(--font);letter-spacing:.06em;color:var(--soft);cursor:pointer;transition:background .2s,color .2s}.map-toggle:hover{color:var(--ink)}.map-toggle[aria-expanded=true]{background:var(--ink);color:var(--paper)}.map-toggle:focus-visible{outline:2px solid var(--accent-deep);outline-offset:1px}.map-toggle svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}@media(max-width:480px){.map-dock{width:min(260px,calc(100vw - 32px))}.hint{bottom:max(76px,env(safe-area-inset-bottom))}body:has(.map:not([hidden])) .hint{display:none}}body:not(.ready) .map-dock{visibility:hidden}
