* { margin: 0; padding: 0; box-sizing: border-box; }
html {
  width: 100%;
  background: #f0ebe4;
}
body {
  width: 100%;
  max-width: 750px;
  margin: 0 auto;
  height: auto;
  min-height: 100%;
  overflow-x: hidden;
  overflow-y: auto;
  font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
  background: #FFF5EB;
  -webkit-tap-highlight-color: transparent;
}
.map-app {
  position: relative;
  width: 100%;
  max-width: 750px;
  margin: 0 auto;
  height: 100vh;
  height: 100dvh;
  overflow: hidden;
  background: #FFF5EB;
}

.header {
  position: absolute; top: 0; left: 0; right: 0; z-index: 1000; height: 48px;
  background: linear-gradient(135deg, #FF6600, #FF8533);
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 12px; padding-top: env(safe-area-inset-top);
  box-shadow: 0 2px 8px rgba(255,102,0,0.3);
}
.header h1 { color: #fff; font-size: 16px; font-weight: 700; letter-spacing: 0.5px; }
.header .source { color: rgba(255,255,255,0.85); font-size: 11px; flex-shrink: 0; margin-left: 8px; }

#mapChart { position: absolute; top: 48px; left: 0; right: 0; bottom: 0; width: 100%; }

.stats-bar {
  position: absolute; bottom: 0; left: 0; right: 0; z-index: 900;
  background: rgba(255,255,255,0.96); backdrop-filter: blur(10px);
  padding: 6px 8px calc(6px + env(safe-area-inset-bottom));
  display: flex; align-items: center; justify-content: space-around;
  box-shadow: 0 -2px 10px rgba(0,0,0,0.06); border-top: 2px solid #FF6600;
}
.stats-item { text-align: center; flex: 1; }
.stats-item .num { font-size: 16px; font-weight: 700; color: #FF6600; }
.stats-item .label { font-size: 10px; color: #999; }

.filter-bar {
  position: absolute; top: 48px; left: 0; right: 0; z-index: 950;
  background: rgba(255,255,255,0.96); backdrop-filter: blur(10px);
  padding: 6px 10px;
  box-shadow: 0 2px 6px rgba(0,0,0,0.05);
  overflow: visible;
}
.filter-bar-scroll {
  display: flex; gap: 6px; align-items: center;
  flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.filter-bar-scroll::-webkit-scrollbar { display: none; }
.filter-bar select, .filter-bar .btn {
  height: 32px; border-radius: 16px; border: 1.5px solid #FFD4A8;
  background: #FFF5EB; color: #FF6600; font-size: 12px; padding: 0 12px;
  cursor: pointer; outline: none; font-weight: 600; white-space: nowrap; flex-shrink: 0;
}
.filter-bar .btn.active { background: #FF6600; color: #fff; border-color: #FF6600; }
.filter-bar .clear-btn { background: #fff; color: #999; border-color: #ddd; }

.time-slider-wrap {
  position: absolute; top: 86px; left: 0; right: 0; z-index: 945;
  background: rgba(255,255,255,0.97); backdrop-filter: blur(10px);
  padding: 10px 14px 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.06);
  transition: transform 0.25s ease, opacity 0.2s ease;
  border-bottom: 1px solid #FFE4C4;
}
.time-slider-wrap.hidden {
  transform: translateY(calc(-100% - 8px));
  opacity: 0;
  pointer-events: none;
  visibility: hidden;
}
.time-slider-wrap .slider-header {
  display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;
}
.time-slider-wrap .slider-title { font-size: 12px; color: #666; font-weight: 600; }
.time-slider-wrap .slider-dates { font-size: 12px; color: #FF6600; font-weight: 700; }
#timeRange {
  width: 100%; -webkit-appearance: none; appearance: none;
  height: 6px; border-radius: 3px; background: #FFE4C4; outline: none;
}
#timeRange::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none;
  width: 22px; height: 22px; border-radius: 50%; background: #FF6600; cursor: pointer;
  box-shadow: 0 2px 6px rgba(255,102,0,0.4); border: 2px solid #fff;
}
#timeRange::-moz-range-thumb {
  width: 22px; height: 22px; border-radius: 50%; background: #FF6600;
  cursor: pointer; border: 2px solid #fff;
}
.slider-labels {
  display: flex; justify-content: space-between; margin-top: 4px; font-size: 10px; color: #aaa;
}

.bottom-sheet {
  position: absolute; bottom: 0; left: 0; right: 0; z-index: 960;
  background: #fff; border-radius: 16px 16px 0 0;
  box-shadow: 0 -4px 20px rgba(0,0,0,0.12); max-height: 72vh;
  transition: transform 0.3s ease; transform: translateY(100%);
  display: block !important;
}
.bottom-sheet.open { transform: translateY(0); }
.bottom-sheet .sheet-handle {
  width: 40px; height: 4px; background: #ddd; border-radius: 2px; margin: 8px auto; cursor: pointer;
}
.bottom-sheet .sheet-header {
  padding: 4px 16px 8px; display: flex; justify-content: space-between; align-items: center;
  border-bottom: 1px solid #f0f0f0;
}
.bottom-sheet .sheet-title { font-size: 15px; font-weight: 700; color: #333; }
.bottom-sheet .sheet-close {
  font-size: 22px; color: #999; cursor: pointer; background: none; border: none; line-height: 1;
  padding: 4px 8px;
}
.sheet-body {
  padding: 12px 14px; overflow-y: auto; max-height: calc(72vh - 56px);
  -webkit-overflow-scrolling: touch;
}

.side-panel { display: none !important; }

.concert-card {
  background: #FFF9F3; border: 1px solid #FFE4C4; border-radius: 10px;
  padding: 12px; margin-bottom: 10px;
}
.concert-card.past { opacity: 0.6; background: #F5F5F5; border-color: #E0E0E0; }
.concert-card .cc-singer {
  font-size: 15px; font-weight: 700; color: #333; margin-bottom: 4px;
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
}
.concert-card.past .cc-singer { color: #888; }
.concert-card .cc-date { font-size: 13px; color: #FF6600; font-weight: 600; margin-bottom: 4px; }
.concert-card.past .cc-date { color: #aaa; }
.concert-card .cc-venue { font-size: 12px; color: #888; margin-bottom: 4px; }
.concert-card .cc-ticket-time { font-size: 12px; color: #E91E63; margin-bottom: 4px; font-weight: 600; }
.cc-city-tag {
  display: inline-block; font-size: 11px; background: #FF6600; color: #fff;
  padding: 1px 8px; border-radius: 10px; margin-right: 6px; vertical-align: middle;
}
.cc-city-tag.past,
.concert-card.past .cc-city-tag,
.tour-item.past .cc-city-tag { background: #bbb; }
.concert-card .cc-bottom {
  display: flex; justify-content: space-between; align-items: center; margin-top: 6px; gap: 8px;
}
.concert-card .cc-price { font-size: 13px; color: #FF6600; font-weight: 600; }
.cc-actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
.cc-btn {
  display: inline-block; font-size: 12px; padding: 6px 12px; border-radius: 14px;
  text-decoration: none; font-weight: 600; line-height: 1.4; white-space: nowrap;
}
.cc-btn-buy { background: #FF6600; color: #fff; }
.cc-btn-detail { background: #FFF5EB; color: #FF6600; border: 1px solid #FFD4A8; }
.concert-card .cc-status { font-size: 11px; padding: 1px 6px; border-radius: 8px; }
.concert-card .cc-status.upcoming { background: #E8F5E9; color: #4CAF50; }
.concert-card .cc-status.past { background: #F5F5F5; color: #999; }

.tour-timeline { position: relative; padding-left: 20px; margin-top: 8px; }
.tour-timeline::before {
  content: ''; position: absolute; left: 5px; top: 0; bottom: 0; width: 2px; background: #FFE4C4;
}
.tour-item { position: relative; margin-bottom: 12px; }
.tour-item::before {
  content: ''; position: absolute; left: -19px; top: 4px; width: 12px; height: 12px;
  border-radius: 50%; background: #FF6600; border: 2px solid #fff; box-shadow: 0 0 0 2px #FF6600;
}
.tour-item.past::before { background: #ccc; box-shadow: 0 0 0 2px #ccc; }
.tour-item .ti-date { font-size: 12px; color: #FF6600; font-weight: 600; }
.tour-item.past .ti-date { color: #aaa; }
.tour-item .ti-city { font-size: 14px; font-weight: 600; color: #333; }
.tour-item.past .ti-city { color: #888; }
.tour-item .ti-venue { font-size: 11px; color: #999; }

.empty-state { text-align: center; padding: 40px 20px; color: #999; }
.empty-state .icon { font-size: 40px; margin-bottom: 8px; }

.loading-overlay {
  position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: #FFF5EB;
  z-index: 9999; display: flex; flex-direction: column; align-items: center; justify-content: center;
}
.loading-overlay .spinner {
  width: 40px; height: 40px; border: 4px solid #FFE4C4; border-top-color: #FF6600;
  border-radius: 50%; animation: spin 0.8s linear infinite; margin-bottom: 16px;
}
.loading-overlay .text { color: #FF6600; font-size: 14px; font-weight: 600; }
@keyframes spin { to { transform: rotate(360deg); } }

.tooltip-box {
  background: rgba(255,255,255,0.96) !important; border: 1px solid #FFD4A8 !important;
  border-radius: 10px !important; padding: 8px 12px !important;
  box-shadow: 0 4px 12px rgba(0,0,0,0.1) !important;
}
.tooltip-box .tt-city { font-size: 14px; font-weight: 700; color: #FF6600; margin-bottom: 4px; }
.tooltip-box .tt-count { font-size: 12px; color: #666; }

.singer-search-wrap { position: relative; flex-shrink: 0; }
.singer-search-wrap .btn { max-width: 140px; width: 140px; }
.singer-dropdown {
  position: absolute; top: 86px; left: 10px; right: 10px; max-height: 50vh; overflow-y: auto;
  background: #fff; border: 1px solid #FFD4A8; border-radius: 10px;
  box-shadow: 0 6px 20px rgba(0,0,0,0.14); z-index: 980; display: none;
  -webkit-overflow-scrolling: touch;
}
.singer-dropdown.show { display: block; }
.singer-option {
  padding: 12px 14px; font-size: 14px; color: #333; cursor: pointer; border-bottom: 1px solid #f5f5f5;
  background: #fff;
}
.singer-option:active { background: #FFF5EB; color: #FF6600; }
.singer-option:last-child { border-bottom: none; }

.legend {
  position: absolute; z-index: 900; background: rgba(255,255,255,0.92);
  backdrop-filter: blur(8px); border-radius: 10px; padding: 6px 10px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.08); font-size: 11px;
  bottom: 52px; left: 10px;
}
.legend .lg-item { display: flex; align-items: center; gap: 6px; margin-bottom: 3px; }
.legend .lg-item:last-child { margin-bottom: 0; }
.legend .lg-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }
.legend .lg-dot.upcoming { background: #FF6600; }
.legend .lg-dot.past { background: #ccc; }
.legend .lg-line { width: 16px; height: 2px; background: #FF6600; display: inline-block; }

.singer-list-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.singer-list-table th {
  text-align: left; padding: 8px 4px; border-bottom: 2px solid #FF6600;
  color: #FF6600; font-size: 11px; font-weight: 700; white-space: nowrap;
}
.singer-list-table td { padding: 8px 4px; border-bottom: 1px solid #f0f0f0; vertical-align: middle; }
.singer-list-table .sl-name { font-weight: 600; color: #333; cursor: pointer; }
.singer-list-table .sl-name.multi { color: #FF6600; }
.singer-list-table .sl-cities { display: flex; flex-wrap: wrap; gap: 4px; }
.singer-list-table .sl-city-chip {
  font-size: 11px; background: #FFF5EB; color: #FF6600; padding: 2px 8px;
  border-radius: 10px; cursor: pointer; border: 1px solid #FFD4A8; white-space: nowrap;
}
.singer-list-table .sl-count {
  font-weight: 700; color: #FF6600; text-align: center; cursor: pointer; min-width: 28px;
}
.singer-list-table .sl-count.multi { text-decoration: underline; }

/* wap footer under map (scroll below first screen) */
.map-page-footer {
  position: relative;
  width: 100%;
  max-width: 750px;
  margin: 0 auto;
  background: #fff;
  border-top: 1px solid #eee;
  z-index: 100;
  font-size: 12px;
  color: #666;
}
.map-page-footer .shotcut,
.map-page-footer .new-shotcut,
.map-page-footer .shotcut-wrap,
.map-page-footer .footer_to-top,
.map-page-footer .back_to_top,
.map-page-footer .back_to_feed {
  display: none !important;
}
.map-page-footer footer {
  padding: 10px 12px 14px;
  text-align: center;
  background: #fff;
}
.map-page-footer .footer-info .link { line-height: 22px; margin-bottom: 6px; }
.map-page-footer .footer-info .link a { color: #666; text-decoration: none; margin: 0 2px; }
.map-page-footer .footer-info .copyright { color: #999; font-size: 11px; line-height: 18px; }
/* keep map tip under bottom sheet */
.echarts-tooltip { z-index: 500 !important; pointer-events: none !important; }
