*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

html, body {
  height: 100%;
}
body {
  background: linear-gradient(160deg, var(--sl-bg-1) 0%, var(--sl-bg-2) 65%);
  font-family: 'Shippori Mincho', system-ui, -apple-system, sans-serif;
  color: var(--sl-text);
  overflow: hidden;
}

/* App-shell: nav fixed at top, detail dock fixed at bottom, map fills and
   scrolls in whatever's left — like a native app screen, not a long page. */
#app-root {
  display: flex;
  flex-direction: column;
  height: 100vh;
  overflow: hidden;
}

.mf-nav-right { display: flex; align-items: center; gap: 14px; }

.sound-toggle {
  background: none;
  border: none;
  font-size: 1.05rem;
  cursor: pointer;
  opacity: .8;
  transition: opacity .15s, transform .1s;
  -webkit-tap-highlight-color: transparent;
}
.sound-toggle:hover  { opacity: 1; }
.sound-toggle:active { transform: scale(.88); }

.mf-inner {
  max-width: 640px;
  width: 100%;
  margin: 0 auto;
  padding: 1.25rem 1.25rem 0;
  display: flex;
  flex-direction: column;
  gap: 1rem;
  flex: 1;
  min-height: 0;
  overflow: hidden;
}

.mf-content {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 0;
  overflow: hidden;
}

/* ── TOP BAR ── */
.topbar {
  background: var(--sl-card);
  border: 1px solid var(--sl-border-faint);
  padding: 1rem 1.1rem;
  display: flex;
  flex-direction: column;
  gap: .6rem;
  flex-shrink: 0;
}
.topbar-main {
  display: flex;
  align-items: baseline;
  gap: .6rem;
}
.topbar-yen {
  font-size: 2.4rem;
  font-weight: 700;
  letter-spacing: -.02em;
  color: var(--sl-gold);
  line-height: 1;
}
.topbar-rate { font-size: .85rem; color: var(--sl-tag-mundial); }
.topbar-streak { font-size: .78rem; font-weight: 700; color: var(--sl-red); }

/* Per-district collect tank — lives in the territory card, not the topbar,
   since collection is now per-district instead of one global pool. */
.bar-label { font-size: .62rem; font-weight: 700; color: var(--sl-text-faint); letter-spacing: .03em; }

.district-collect { display: flex; flex-direction: column; gap: .35rem; }
.district-collect-bar {
  height: 10px;
  background: var(--sl-pill-bg);
  border: 1px solid var(--sl-border-faint);
  overflow: hidden;
}
.district-collect-fill {
  height: 100%;
  background: var(--sl-gold);
  transition: width .2s ease;
}
.district-collect-fill.draining { transition: width .5s ease-out; }
.district-collect-btn { width: 100%; }
.district-collect-btn.ready { animation: collectReadyPulse 1.2s ease-in-out infinite; }
@keyframes collectReadyPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(216, 192, 138, .55); }
  50%      { box-shadow: 0 0 0 6px rgba(216, 192, 138, 0); }
}

.topbar-hq {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: .6rem;
  border-top: 1px solid var(--sl-border-faint);
  padding-top: .6rem;
}
.topbar-fp { font-size: .78rem; color: var(--sl-tag-finance); font-weight: 700; flex-shrink: 0; }
.topbar-hq-mult { font-size: .68rem; color: var(--sl-text-faint); margin-left: auto; }

/* ── BUTTONS (shared) ── */
.t-btn {
  background: var(--sl-gold);
  color: var(--sl-panel);
  border: 1px solid var(--sl-gold);
  border-radius: 0;
  font-size: .7rem;
  font-weight: 700;
  font-family: inherit;
  line-height: 1.3;
  padding: .35rem .75rem;
  cursor: pointer;
  transition: opacity .15s;
  text-align: center;
  white-space: normal;
  overflow-wrap: break-word;
}
.t-btn:hover:not(.dim) { opacity: .85; }
.t-btn.dim, .t-btn:disabled { background: var(--sl-pill-bg); color: var(--sl-text-faint); border-color: var(--sl-border-faint); cursor: default; opacity: 1; }

/* ── HEX MAP ── */
.hex-map-scroll {
  flex: 1;
  min-height: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  touch-action: none;
  margin: 0 -1.25rem;
  padding: 12px 0;
  scrollbar-width: thin;
  scrollbar-color: var(--sl-border) transparent;
  cursor: grab;
}
.hex-map-scroll.dragging { cursor: grabbing; }

.hex-map {
  position: relative;
}

.hex-tile {
  position: absolute;
  transform: translate(-50%, -50%);
  width: var(--hex-w, 84px);
  height: var(--hex-h, 97px);
  clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
  background: var(--sl-pill-bg);
  border: none;
  cursor: pointer;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: .15rem;
  transition: filter .15s;
}
.hex-tile.fog {
  background: var(--sl-bg-2);
  opacity: .5;
  cursor: default;
  pointer-events: none;
}
.hex-tile.unreachable { opacity: .35; cursor: default; }
.hex-tile.reachable  { background: var(--sl-card); }
.hex-tile.competing  { background: var(--sl-card); }
.hex-tile.won        { background: var(--sl-tag-mundial); }

/* How built-up a district is (stores / MAX_STORES_PER_ZONE) shows directly on
   its hex — a fresh district looks visibly duller/smaller than a maxed one,
   instead of every hex looking identical regardless of progress. */
.hex-tile.competing, .hex-tile.won {
  filter: saturate(calc(0.65 + var(--fill, 0) * 0.55)) brightness(calc(0.9 + var(--fill, 0) * 0.2));
}
.hex-tile.selected {
  transform: translate(-50%, -50%) scale(1.18);
  z-index: 2;
  animation: hexSelectedPulse 1.6s ease-in-out infinite;
}
@keyframes hexSelectedPulse {
  0%, 100% { filter: drop-shadow(0 0 4px var(--sl-gold)) drop-shadow(0 0 10px var(--sl-gold)); }
  50%      { filter: drop-shadow(0 0 4px var(--sl-gold)) drop-shadow(0 0 18px var(--sl-gold)); }
}

/* Rendered as a separate sibling, not a pseudo-element of .hex-tile — a
   clip-path on an element also clips its own children/pseudo-elements, so a
   ::before frame inside the hex got cropped away and never showed. */
.hex-frame {
  position: absolute;
  transform: translate(-50%, -50%) scale(1.18);
  width: calc(var(--hex-w, 84px) + 6px);
  height: calc(var(--hex-h, 97px) + 5px);
  clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
  background: var(--sl-gold);
  z-index: 1;
  pointer-events: none;
}

.hex-emoji { font-size: calc(1.5rem + var(--fill, 0) * .3rem); line-height: 1; transition: font-size .3s ease; }
.hex-badge { font-size: .58rem; font-weight: 700; color: var(--sl-text-faint); }
.hex-tile.competing .hex-badge { color: var(--sl-red); }
.hex-tile.won .hex-badge       { color: var(--sl-panel); }

/* Best-rank badge — a sibling for the same reason as the frame/collect-dot
   above. Only shown once a district has at least one store above Rank D. */
.hex-tier-badge {
  position: absolute;
  transform: translate(calc(-50% - 26px), calc(-50% + 34px));
  font-size: .6rem;
  font-weight: 700;
  line-height: 1;
  padding: .1rem .25rem;
  background: var(--sl-gold);
  color: var(--sl-panel);
  z-index: 3;
  pointer-events: none;
}

/* "Ready to collect" badge — also a sibling (see .hex-frame note above), since
   it sits near the hex's corner where the hexagon's own clip-path doesn't
   reach, so it would get cropped away if it were a child of the tile. */
.hex-collect-dot {
  position: absolute;
  transform: translate(calc(-50% + 26px), calc(-50% - 34px)) scale(0);
  font-size: .8rem;
  z-index: 3;
  opacity: 0;
  pointer-events: none;
  filter: drop-shadow(0 0 3px rgba(0, 0, 0, .7));
  transition: opacity .15s, transform .15s;
}
.hex-collect-dot.visible {
  opacity: 1;
  transform: translate(calc(-50% + 26px), calc(-50% - 34px)) scale(1);
  animation: collectDotPulse 1s ease-in-out infinite;
}
@keyframes collectDotPulse {
  0%, 100% { transform: translate(calc(-50% + 26px), calc(-50% - 34px)) scale(1); }
  50%      { transform: translate(calc(-50% + 26px), calc(-50% - 34px)) scale(1.35); }
}

/* ── TERRITORY DETAIL DOCK — pinned at the bottom, always visible regardless
   of map scroll position, so the selected zone's stats are never hidden.
   Fixed height (not max-height) so it never resizes between states — locked,
   reachable, competing and won cards all sit inside the same constant box. ── */
.territory-detail {
  flex-shrink: 0;
  margin: 0 -1.25rem;
  border-top: 2px solid var(--sl-border);
  background: var(--sl-nav-bg);
  height: 230px;
  overflow-y: auto;
}

.territory-card {
  background: var(--sl-card);
  border: 1px solid var(--sl-border-faint);
  padding: .8rem 1rem;
  margin: .75rem 1.25rem 0;
  display: flex;
  flex-direction: column;
  gap: .55rem;
  transition: border-color .15s;
}

.territory-card.collect-flash {
  animation: cardCollectShake .4s ease, cardCollectGlow .7s ease;
}
@keyframes cardCollectShake {
  0%, 100% { transform: translateX(0); }
  20% { transform: translateX(-5px); }
  40% { transform: translateX(5px); }
  60% { transform: translateX(-3px); }
  80% { transform: translateX(3px); }
}
@keyframes cardCollectGlow {
  0%   { box-shadow: 0 0 0 0 transparent; }
  25%  { box-shadow: 0 0 20px 3px var(--sl-tag-mundial); }
  100% { box-shadow: 0 0 0 0 transparent; }
}

.territory-image {
  margin: -.8rem -1rem 0;
  height: 96px;
  overflow: hidden;
  background: var(--sl-pill-bg);
  position: relative;
}
.territory-image img { width: 100%; height: 100%; object-fit: cover; display: block; }
.territory-image-fallback {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 2.4rem;
}
.territory-card.competing  { border-color: var(--sl-border); }
.territory-card.won        { border-color: var(--sl-tag-mundial); }
.territory-card.reachable  { border-color: var(--sl-gold); }
.territory-card.unreachable { opacity: .55; }

.territory-head {
  display: flex;
  align-items: center;
  gap: .6rem;
}
.territory-emoji { font-size: 1.5rem; line-height: 1; flex-shrink: 0; }
.territory-name  { font-size: .9rem; font-weight: 700; color: var(--sl-text); flex: 1; }
.territory-status { font-size: .68rem; font-weight: 700; color: var(--sl-text-faint); white-space: nowrap; }
.territory-card.won .territory-status { color: var(--sl-tag-mundial); }
.territory-hint { font-size: .72rem; color: var(--sl-text-faint); }
.territory-desc { font-size: .72rem; color: var(--sl-text-soft); line-height: 1.35; }

.district-manager-badge {
  font-size: .64rem;
  font-weight: 700;
  color: var(--sl-gold);
  border: 1px solid var(--sl-gold);
  background: var(--sl-pill-bg);
  padding: .3rem .55rem;
  width: fit-content;
}

.market-bar {
  height: 8px;
  background: var(--sl-pill-bg);
  border: 1px solid var(--sl-border-faint);
  overflow: hidden;
}
.market-fill {
  height: 100%;
  background: var(--sl-red);
  transition: width .25s ease;
}
.territory-card.won .market-fill { background: var(--sl-tag-mundial); }

.market-legend {
  display: flex;
  justify-content: space-between;
  font-size: .65rem;
  font-weight: 700;
}
.market-you   { color: var(--sl-gold); }
.market-rival { color: var(--sl-red); }

.plots-section {
  margin: .6rem 1.25rem calc(.75rem + env(safe-area-inset-bottom, 0px));
  display: flex;
  flex-direction: column;
  gap: .4rem;
}
.plots-label { font-size: .65rem; font-weight: 700; color: var(--sl-text-faint); letter-spacing: .04em; text-transform: uppercase; }

.plots-row { display: flex; flex-direction: column; gap: .4rem; }

.store-mgr-btn {
  width: 100%;
  background: var(--sl-pill-bg);
  border: 1px solid var(--sl-tag-finance);
  border-radius: 0;
  font-family: inherit;
  font-size: .62rem;
  font-weight: 700;
  color: var(--sl-tag-finance);
  padding: .4rem .5rem;
  cursor: pointer;
  white-space: nowrap;
  transition: opacity .15s;
}
.store-mgr-btn:hover:not(.dim) { opacity: .8; }
.store-mgr-btn.dim, .store-mgr-btn:disabled { opacity: 1; color: var(--sl-text-faint); border-color: var(--sl-border-faint); cursor: default; }

.store-manager-row { display: flex; gap: .35rem; align-items: stretch; }

/* Manager character chip — color signals how lucky the pick was. */
.store-manager {
  flex: 1;
  min-width: 0;
  font-size: .64rem;
  font-weight: 700;
  padding: .3rem .5rem;
  border: 1px solid var(--sl-border-faint);
  background: var(--sl-pill-bg);
}
.store-manager.common    { color: var(--sl-text-faint); }
.store-manager.uncommon  { color: var(--sl-text); border-color: var(--sl-border); }
.store-manager.rare      { color: var(--sl-gold); border-color: var(--sl-gold); }
.store-manager.legendary { color: var(--sl-red); border-color: var(--sl-red); }

.store-fire-btn {
  flex-shrink: 0;
  background: var(--sl-pill-bg);
  border: 1px solid var(--sl-red);
  border-radius: 0;
  font-size: .68rem;
  padding: .3rem .5rem;
  cursor: pointer;
  transition: opacity .15s;
}
.store-fire-btn:hover { opacity: .7; }

/* ── STORES — individually named & ranked, Yakuza Real Estate Royale style ── */
.store-slot {
  width: 100%;
  background: var(--sl-card);
  border: 1px solid var(--sl-gold);
  border-radius: 0;
  font-family: inherit;
  cursor: pointer;
  padding: .5rem .65rem;
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: .55rem;
  text-align: left;
  transition: opacity .15s;
}
.store-slot.vacant:hover:not(.dim) { opacity: .85; }
.store-slot.dim, .store-slot:disabled { opacity: 1; border-color: var(--sl-border-faint); background: var(--sl-pill-bg); cursor: default; }
.store-slot.owned { flex-direction: column; align-items: stretch; gap: .4rem; border-color: var(--sl-tag-mundial); cursor: default; }
.store-slot-main { display: flex; flex-direction: row; align-items: center; gap: .55rem; }
.store-slot-emoji { font-size: 1.2rem; line-height: 1; flex-shrink: 0; }
.store-slot-body { display: flex; flex-direction: column; gap: .1rem; flex: 1; min-width: 0; }
.store-slot-name { font-size: .72rem; font-weight: 700; color: var(--sl-text); line-height: 1.15; }
.store-slot-vacant-label { font-size: .6rem; color: var(--sl-text-faint); font-style: italic; }
.store-slot-cost { font-size: .68rem; font-weight: 700; color: var(--sl-gold); flex-shrink: 0; white-space: nowrap; }
.store-slot.dim .store-slot-cost, .store-slot:disabled .store-slot-cost { color: var(--sl-text-faint); }
.store-slot-prod { font-size: .68rem; font-weight: 700; color: var(--sl-tag-mundial); flex-shrink: 0; white-space: nowrap; }

.store-slot-rank {
  display: inline-block;
  font-size: .6rem;
  font-weight: 700;
  padding: .1rem .35rem;
  width: fit-content;
  border: 1px solid var(--sl-border-faint);
}
.store-slot-rank.rank-D     { color: var(--sl-text-faint); }
.store-slot-rank.rank-C     { color: var(--sl-text); border-color: var(--sl-border); }
.store-slot-rank.rank-B     { color: var(--sl-tag-mundial); border-color: var(--sl-tag-mundial); }
.store-slot-rank.rank-A     { color: var(--sl-tag-finance); border-color: var(--sl-tag-finance); }
.store-slot-rank.rank-S     { color: var(--sl-gold); border-color: var(--sl-gold); }
.store-slot-rank.rank-Splus { color: var(--sl-red); border-color: var(--sl-red); }

/* Hold-to-rank-up bar — the fill is invested cash, so it persists between
   holds instead of resetting if you run out of money partway through. */
.store-rankup-btn {
  position: relative;
  overflow: hidden;
  width: 100%;
  background: var(--sl-pill-bg);
  border: 1px solid var(--sl-gold);
  border-radius: 0;
  font-family: inherit;
  font-size: .62rem;
  font-weight: 700;
  color: var(--sl-gold);
  padding: .4rem .5rem;
  cursor: pointer;
  white-space: nowrap;
  user-select: none;
  touch-action: none;
}
.rankup-fill {
  position: absolute;
  inset: 0;
  width: 0%;
  background: var(--sl-gold);
  opacity: .3;
  transition: width .1s linear;
  z-index: 0;
}
.rankup-label { position: relative; z-index: 1; }
.store-slot-maxed { font-size: .62rem; color: var(--sl-gold); font-weight: 700; text-align: center; }

/* ── BUY PARTICLES ── */
#particle-layer {
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 200;
}
.buy-float {
  position: absolute;
  transform: translate(-50%, -50%);
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--sl-gold);
  white-space: nowrap;
  animation: buyFloatUp .9s ease-out forwards;
}
@keyframes buyFloatUp {
  0%   { opacity: 1; transform: translate(-50%, -50%) translateY(0) scale(1); }
  100% { opacity: 0; transform: translate(-50%, -50%) translateY(-55px) scale(1.15); }
}

.money-particle {
  position: absolute;
  transform: translate(-50%, -50%);
  font-size: 1.15rem;
  animation: moneyBurst .85s ease-out forwards;
}
@keyframes moneyBurst {
  0%   { transform: translate(-50%, -50%) translate(0, 0) scale(.6) rotate(0deg); opacity: 1; }
  100% { transform: translate(-50%, -50%) translate(var(--dx), var(--dy)) scale(1.3) rotate(180deg); opacity: 0; }
}

.tier-particle {
  position: absolute;
  transform: translate(-50%, -50%);
  font-size: 1.6rem;
  animation: tierBurst 1s ease-out forwards;
}
@keyframes tierBurst {
  0%   { transform: translate(-50%, -50%) translate(0, 0) scale(.4) rotate(0deg); opacity: 1; }
  100% { transform: translate(-50%, -50%) translate(var(--dx), var(--dy)) scale(1.6) rotate(220deg); opacity: 0; }
}

/* ── RAID MINIGAME ── */
.raid-overlay {
  position: fixed;
  inset: 0;
  z-index: 300;
  background: rgba(0, 0, 0, .7);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
}
.raid-overlay.hidden { display: none; }

.raid-card {
  background: var(--sl-card);
  border: 2px solid var(--sl-red);
  padding: 1.5rem 1.25rem;
  width: 100%;
  max-width: 340px;
  text-align: center;
  display: flex;
  flex-direction: column;
  gap: .65rem;
  animation: raidTension .15s ease-in-out infinite alternate;
}
@keyframes raidTension {
  0%   { transform: translateX(-2px) rotate(-.3deg); }
  100% { transform: translateX(2px) rotate(.3deg); }
}
.raid-card.danger {
  animation: raidTension .08s ease-in-out infinite alternate, raidDangerGlow .5s ease-in-out infinite;
}
@keyframes raidDangerGlow {
  0%, 100% { box-shadow: 0 0 0 0 rgba(214, 91, 70, .65); }
  50%      { box-shadow: 0 0 22px 6px rgba(214, 91, 70, .65); }
}

.raid-title { font-size: 1rem; font-weight: 700; color: var(--sl-red); }
.raid-sub { font-size: .75rem; color: var(--sl-text-faint); }

.raid-bar {
  height: 16px;
  background: var(--sl-pill-bg);
  border: 1px solid var(--sl-border-faint);
  overflow: hidden;
}
.raid-bar.pushed { animation: raidPush .15s ease-out; }
@keyframes raidPush {
  0%   { transform: scaleY(1.5); }
  100% { transform: scaleY(1); }
}
.raid-fill {
  height: 100%;
  transition: width .1s linear, background-color .2s ease;
}
.raid-fill.low  { background: var(--sl-red); }
.raid-fill.mid  { background: var(--sl-gold); }
.raid-fill.high { background: var(--sl-tag-mundial); }

.raid-stats {
  display: flex;
  justify-content: space-between;
  font-size: .8rem;
  font-weight: 700;
  color: var(--sl-text);
}

.raid-defend-btn {
  background: var(--sl-red);
  color: var(--sl-on-panel);
  border: 1px solid var(--sl-red);
  border-radius: 0;
  font-family: inherit;
  font-size: .95rem;
  font-weight: 700;
  padding: 1.1rem .75rem;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  user-select: none;
  transition: transform .05s, opacity .15s;
}
.raid-defend-btn:active { transform: scale(.92); }
.raid-defend-btn.dim { opacity: .45; }

.flying-bill {
  position: absolute;
  transform: translate(-50%, -50%);
  font-size: 1.3rem;
  pointer-events: none;
  z-index: 250;
  animation: billFly .7s ease-out forwards;
}
@keyframes billFly {
  0%   { opacity: 1; transform: translate(-50%, -50%) translate(0, 0) scale(.8) rotate(0deg); }
  100% { opacity: 0; transform: translate(-50%, -50%) translate(var(--dx), -72px) scale(1.15) rotate(50deg); }
}

/* ── DAILY STREAK BONUS ── */
.daily-overlay {
  position: fixed;
  inset: 0;
  z-index: 300;
  background: rgba(0, 0, 0, .7);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
}
.daily-overlay.hidden { display: none; }

.daily-card {
  background: var(--sl-card);
  border: 2px solid var(--sl-gold);
  padding: 1.75rem 1.5rem;
  width: 100%;
  max-width: 340px;
  text-align: center;
  display: flex;
  flex-direction: column;
  gap: .85rem;
  animation: dailyPopIn .3s ease;
}
@keyframes dailyPopIn {
  0%   { opacity: 0; transform: scale(.85); }
  100% { opacity: 1; transform: scale(1); }
}
.daily-card.milestone {
  border-color: var(--sl-red);
  animation: dailyPopIn .3s ease, raidDangerGlow 1s ease-in-out infinite;
}

.daily-title { font-size: 1.15rem; font-weight: 700; color: var(--sl-gold); }
.daily-sub { font-size: .78rem; color: var(--sl-text-faint); }

.daily-reward { display: flex; flex-direction: column; gap: .25rem; }
.daily-reward-yen { font-size: 1.6rem; font-weight: 700; color: var(--sl-gold); }
.daily-reward-fp { font-size: .85rem; font-weight: 700; color: var(--sl-tag-finance); }

.daily-claim-btn {
  background: var(--sl-gold);
  color: var(--sl-panel);
  border: 1px solid var(--sl-gold);
  border-radius: 0;
  font-family: inherit;
  font-size: .95rem;
  font-weight: 700;
  padding: .9rem .75rem;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: transform .05s, opacity .15s;
}
.daily-claim-btn:hover { opacity: .85; }
.daily-claim-btn:active { transform: scale(.95); }

/* ── ACHIEVEMENTS ── */
.achievements-overlay {
  position: fixed;
  inset: 0;
  z-index: 300;
  background: rgba(0, 0, 0, .7);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.25rem;
}
.achievements-overlay.hidden { display: none; }

.achievements-panel {
  background: var(--sl-card);
  border: 2px solid var(--sl-gold);
  width: 100%;
  max-width: 460px;
  max-height: 80vh;
  display: flex;
  flex-direction: column;
}

.achievements-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: .9rem 1rem;
  border-bottom: 1px solid var(--sl-border-faint);
  flex-shrink: 0;
}
.achievements-title { font-size: .9rem; font-weight: 700; color: var(--sl-gold); }
.achievements-close {
  background: none;
  border: none;
  color: var(--sl-text-faint);
  font-size: 1rem;
  cursor: pointer;
  padding: .2rem .4rem;
  -webkit-tap-highlight-color: transparent;
}
.achievements-close:hover { color: var(--sl-text); }

.achievements-list {
  overflow-y: auto;
  padding: .6rem;
  display: flex;
  flex-direction: column;
  gap: .5rem;
}

.ach-item {
  display: flex;
  align-items: center;
  gap: .65rem;
  padding: .55rem .7rem;
  border: 1px solid var(--sl-border-faint);
  background: var(--sl-pill-bg);
}
.ach-item.unlocked { border-color: var(--sl-tag-mundial); background: var(--sl-card); }
.ach-item.locked { opacity: .55; }
.ach-emoji { font-size: 1.3rem; line-height: 1; flex-shrink: 0; }
.ach-body { display: flex; flex-direction: column; gap: .1rem; flex: 1; min-width: 0; }
.ach-name { font-size: .78rem; font-weight: 700; color: var(--sl-text); }
.ach-desc { font-size: .68rem; color: var(--sl-text-faint); }
.ach-reward { font-size: .68rem; font-weight: 700; color: var(--sl-tag-finance); flex-shrink: 0; white-space: nowrap; }

/* ── MANAGER SELECTION ── */
.mgr-option {
  display: flex;
  align-items: center;
  gap: .65rem;
  padding: .55rem .7rem;
  border: 1px solid var(--sl-border-faint);
  background: var(--sl-pill-bg);
}
.mgr-option.uncommon  { border-color: var(--sl-border); }
.mgr-option.rare      { border-color: var(--sl-gold); }
.mgr-option.legendary { border-color: var(--sl-red); }
.mgr-tier-symbol {
  font-size: 1.1rem;
  font-weight: 700;
  line-height: 1;
  flex-shrink: 0;
  width: 1.4rem;
  text-align: center;
}
.mgr-tier-symbol.common    { color: var(--sl-text-faint); }
.mgr-tier-symbol.uncommon  { color: var(--sl-text); }
.mgr-tier-symbol.rare      { color: var(--sl-gold); }
.mgr-tier-symbol.legendary { color: var(--sl-red); }
.mgr-option-emoji { font-size: 1.3rem; line-height: 1; flex-shrink: 0; }
.mgr-option-body { display: flex; flex-direction: column; gap: .1rem; flex: 1; min-width: 0; }
.mgr-option-name { font-size: .78rem; font-weight: 700; color: var(--sl-text); }
.mgr-option-trait { font-size: .65rem; font-weight: 700; }
.mgr-option-trait.good { color: var(--sl-tag-mundial); }
.mgr-option-trait.bad  { color: var(--sl-red); }
.mgr-option-stats { font-size: .65rem; color: var(--sl-text-faint); }
.mgr-option .t-btn { flex-shrink: 0; min-width: 70px; }

/* ── TOAST ── */
.mf-toast {
  position: fixed;
  bottom: 24px;
  left: 50%;
  transform: translateX(-50%);
  background: var(--sl-card);
  border: 1px solid var(--sl-gold);
  color: var(--sl-text);
  padding: .55rem 1.25rem;
  border-radius: 0;
  font-size: .82rem;
  font-weight: 700;
  z-index: 100;
  pointer-events: none;
  white-space: nowrap;
  animation: toastIn .25s ease, toastOut .25s ease 2.75s forwards;
}
@keyframes toastIn  { from { opacity: 0; transform: translateX(-50%) translateY(8px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }
@keyframes toastOut { from { opacity: 1; } to { opacity: 0; } }

@media (min-width: 820px) {
  .mf-inner { max-width: 1180px; padding: 1.75rem 2rem 1.5rem; gap: 1.25rem; }
  .topbar-yen { font-size: 2.8rem; }

  /* Topbar becomes a single row of sections instead of stacked blocks. */
  .topbar { flex-direction: row; align-items: center; gap: 1.75rem; padding: 1.1rem 1.5rem; }
  .topbar-main { flex: 0 0 auto; }
  .topbar-hq {
    flex: 1;
    border-top: none;
    padding-top: 0;
    padding-left: 1.75rem;
    border-left: 1px solid var(--sl-border-faint);
  }

  /* Map (left, grows) and detail panel (right, fixed-width sidebar spanning
     the full content height) sit side by side instead of stacked. */
  .mf-content { flex-direction: row; gap: 1.25rem; }

  .hex-map-scroll { margin: 0; border: 1px solid var(--sl-border-faint); }

  .territory-detail {
    flex-shrink: 0;
    width: 320px;
    height: auto;
    margin: 0;
    border-top: none;
    border: 1px solid var(--sl-border);
  }
  .territory-card { margin: 1rem; }
  .plots-section { margin: 0 1rem 1rem; }

  /* Bigger hex tiles for desktop are set via --hex-w/--hex-h, which JS sets
     inline (in sync with this same 820px breakpoint) so tile size and the
     JS hex-center spacing never disagree. */
  .hex-emoji { font-size: calc(1.8rem + var(--fill, 0) * .35rem); }
  .hex-badge { font-size: .65rem; }
}
