:root{--bg:#f4f6f8;--panel:#fff;--text:#1f2937;--muted:#6b7280;--border:#e5e7eb;--green:#22c55e;--blue:#3b82f6;--gray:#9ca3af;--shadow:0 8px 24px rgba(15,23,42,.08)}*{box-sizing:border-box}body,html{margin:0;padding:0;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans TC,PingFang TC,Microsoft JhengHei,sans-serif;background:var(--bg);color:var(--text)}.app-shell{display:grid;grid-template-rows:auto 1fr auto;height:100vh}.app-header{padding:12px 20px;background:var(--panel);border-bottom:1px solid var(--border);box-shadow:var(--shadow);display:flex;align-items:center;justify-content:space-between;gap:16px;z-index:10}.app-title{margin:0;font-size:18px;font-weight:600}.app-subtitle{font-size:13px;color:var(--muted)}.search-row{display:flex;gap:8px;align-items:center}.search-row input{width:320px;max-width:50vw;padding:8px 12px;font-size:14px;border:1px solid var(--border);border-radius:8px;outline:none}.search-row input:focus{border-color:#94a3b8}.search-row button{padding:8px 14px;font-size:14px;border:1px solid var(--border);background:var(--panel);border-radius:8px;cursor:pointer}.search-row button:hover{background:#f1f5f9}.map-outer{padding:0;background:var(--bg);min-height:0}.ad-bar{background:var(--panel);border-top:1px solid var(--border);min-height:90px;padding:0 16px;overflow:hidden}.ad-bar,.ad-bar-placeholder{display:flex;align-items:center;justify-content:center}.ad-bar-placeholder{width:100%;max-width:728px;height:90px;border:1.5px dashed #d1d5db;border-radius:6px;gap:8px;font-size:12px;color:#9ca3af;background:#f9fafb;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none}.map-wrap{position:relative;border-radius:14px;overflow:hidden;box-shadow:0 4px 24px rgba(15,23,42,.13)}#map,.map-wrap{width:100%;height:100%}#map.pin-mode{cursor:crosshair!important}.toast{position:absolute;left:50%;top:16px;transform:translateX(-50%);background:rgba(15,23,42,.92);color:#fff;padding:8px 14px;border-radius:8px;font-size:13px;z-index:1000;pointer-events:none}.vote-form{font-family:inherit;min-width:220px}.vote-form .vote-label{font-size:12px;color:var(--muted);margin-bottom:6px}.vote-form .vote-place{font-size:14px;font-weight:600;margin-bottom:8px;word-break:break-word}.vote-form .vote-custom-name{display:block;width:100%;padding:6px 10px;font-size:13px;font-family:inherit;border:1px solid var(--border);border-radius:7px;outline:none;margin-bottom:10px;color:var(--text);background:#f8fafc}.vote-form .vote-custom-name:focus{border-color:#94a3b8;background:#fff}.vote-form .vote-buttons{display:flex;gap:8px;margin-bottom:8px}.vote-form .vote-btn{flex:1 1;border:2px solid transparent;cursor:pointer;padding:10px 0;font-size:14px;font-weight:600;border-radius:8px;color:#fff}.vote-form .vote-btn.green{background:var(--green)}.vote-form .vote-btn.blue{background:var(--blue)}.vote-form .vote-btn.gray{background:#fcfcfc;color:#374151;border:1.5px solid #d1d5db}.vote-form .vote-btn.selected{outline:2px solid #0f172a;outline-offset:1px}.vote-form .vote-actions{display:flex;gap:8px;margin-top:4px}.vote-form .vote-cancel{padding:10px 14px;font-size:14px;font-family:inherit;border:1px solid var(--border);background:#fff;border-radius:8px;cursor:pointer;white-space:nowrap}.vote-form .vote-cancel:hover{background:#f1f5f9}.vote-form .vote-submit{flex:1 1;padding:10px 0;font-size:14px;background:#0f172a;color:#fff;border:none;border-radius:8px;cursor:pointer}.vote-form .vote-submit:disabled{opacity:.5;cursor:not-allowed}.vote-form .vote-msg{font-size:12px;margin-top:8px;color:var(--muted)}.vote-form .vote-msg.error{color:#dc2626}.vote-form .vote-captcha{margin-top:10px;display:flex;justify-content:center}.vote-form .vote-location-meta{margin-top:8px;font-size:11px;color:#9ca3af;display:flex;align-items:center;gap:6px}.vote-form .vote-msg .vote-short-code,.vote-form .vote-short-code{font-family:Courier New,monospace;font-weight:700;color:#374151;letter-spacing:.05em}.vote-form .vote-msg .vote-report-link,.vote-form .vote-report-link{background:none;border:none;padding:0;font-size:11px;color:#dc2626;cursor:pointer;text-decoration:underline;white-space:nowrap}.vote-form .vote-msg .vote-report-link:hover,.vote-form .vote-report-link:hover{opacity:.75}.map-menu-btn{position:absolute;top:12px;left:16px;z-index:1200;width:36px;height:36px;border-radius:50%;border:1px solid var(--border);background:#fff;cursor:pointer;font-size:16px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px rgba(0,0,0,.15);transition:background .15s}.map-menu-btn:hover{background:#f1f5f9}.map-menu-panel{position:absolute;top:56px;left:16px;z-index:1300;background:#fff;border:1px solid var(--border);border-radius:12px;padding:8px 0;min-width:200px;box-shadow:0 4px 16px rgba(15,23,42,.13);animation:menu-in .15s ease}@keyframes menu-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}.map-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 16px;font-size:14px;font-family:inherit;border:none;background:none;cursor:pointer;color:var(--text);text-align:left;white-space:nowrap}.map-menu-item:hover{background:#f8fafc}.map-menu-divider{height:1px;background:var(--border);margin:4px 0}.nearby-panel{position:absolute;top:56px;right:16px;bottom:56px;z-index:1300;width:300px;background:#fff;border:1px solid var(--border);border-radius:12px;display:flex;flex-direction:column;box-shadow:0 4px 16px rgba(15,23,42,.13);animation:menu-in .15s ease}.nearby-panel-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--border);font-size:14px;font-weight:600}.nearby-panel-close{border:none;background:none;cursor:pointer;font-size:16px;color:var(--muted);padding:2px 6px;border-radius:4px}.nearby-panel-close:hover{background:#f1f5f9}.nearby-panel-body{flex:1 1;overflow-y:auto;padding:8px 0}.nearby-item{display:flex;align-items:center;gap:10px;padding:10px 16px;border-bottom:1px solid #f3f4f6;cursor:pointer;transition:background .1s}.nearby-item:hover{background:#f8fafc}.nearby-rank{font-size:13px;font-weight:700;color:var(--muted);width:22px;text-align:center;flex-shrink:0}.nearby-rank.top3{color:#f59e0b}.nearby-info{flex:1 1;min-width:0}.nearby-name{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nearby-dist{font-size:11px;color:var(--muted);margin-top:1px}.nearby-votes{font-size:12px;display:flex;gap:4px;flex-shrink:0}.nearby-votes .b{color:var(--blue);font-weight:600}.nearby-votes .g{color:var(--green);font-weight:600}.nearby-votes .y{color:#374151;background:#fcfcfc;border:1px solid #d1d5db;border-radius:3px;padding:1px 4px;font-weight:600}.nearby-code{font-family:Courier New,monospace;font-size:10px;color:#9ca3af;letter-spacing:.05em}.nearby-report-btn{flex-shrink:0;background:none;border:none;padding:4px 6px;font-size:13px;color:#dc2626;cursor:pointer;opacity:.65;border-radius:4px;transition:opacity .15s,background .15s}.nearby-report-btn:hover{opacity:1;background:#fff5f5}.agg-label{background:hsla(0,0%,100%,.95);border:1px solid var(--border);padding:2px 6px;font-size:12px;border-radius:6px;white-space:nowrap;box-shadow:0 2px 4px rgba(15,23,42,.1)}.agg-label .b{color:var(--blue);font-weight:600}.agg-label .g{color:var(--green);font-weight:600}.agg-label .y{color:#374151;background:#fcfcfc;border:1px solid #d1d5db;border-radius:3px;padding:1px 3px;font-weight:600}.user-location-dot{position:relative;width:16px;height:16px}.user-location-dot:before{content:"";position:absolute;inset:0;border-radius:50%;background:#3b82f6;border:2.5px solid #fff;box-shadow:0 1px 4px rgba(59,130,246,.5)}.user-location-dot:after{content:"";position:absolute;top:50%;left:50%;translate:-50% -50%;width:32px;height:32px;border-radius:50%;background:rgba(59,130,246,.18);animation:user-loc-pulse 2s ease-out infinite}@keyframes user-loc-pulse{0%{transform:scale(.5);opacity:.8}70%{transform:scale(1);opacity:.2}to{transform:scale(1.1);opacity:0}}