/* Party: the click-a-player menu, the incoming invite prompt, and the roster. */

.party-menu {
  position: fixed;
  z-index: 2147483000;
  min-width: 190px;
  padding: 8px;
  border-radius: 12px;
  background: rgba(16, 16, 24, .97);
  border: 1px solid rgba(255, 255, 255, .14);
  box-shadow: 0 18px 44px rgba(0, 0, 0, .55);
  font: 600 14px/1.2 system-ui, -apple-system, "Segoe UI", sans-serif;
  color: #eef2ff;
}
.party-menu-name {
  padding: 6px 8px 10px;
  color: #9fb6c9;
  font-size: 12px;
  letter-spacing: .3px;
  text-transform: uppercase;
}
.party-menu button {
  display: block;
  width: 100%;
  padding: 10px 12px;
  margin-top: 4px;
  border: 0;
  border-radius: 9px;
  background: linear-gradient(180deg, #3b82f6, #2563eb);
  color: #fff;
  font: inherit;
  cursor: pointer;
}
.party-menu button:hover { filter: brightness(1.12); }
.party-menu button.is-quiet { background: rgba(255, 255, 255, .10); }

/* Incoming invite. Deliberately centred and modal-ish: it expires, so it must not
   be missed in a corner. */
.party-invite {
  position: fixed;
  left: 50%;
  top: 96px;
  transform: translateX(-50%);
  z-index: 2147483000;
  min-width: 340px;
  padding: 16px 18px;
  border-radius: 16px;
  background: rgba(14, 14, 22, .97);
  border: 1px solid rgba(120, 200, 255, .35);
  box-shadow: 0 22px 60px rgba(0, 0, 0, .6), 0 0 40px rgba(80, 170, 255, .25);
  color: #eef2ff;
  font: 600 15px/1.35 system-ui, -apple-system, "Segoe UI", sans-serif;
  text-align: center;
  animation: party-invite-in 220ms ease-out;
}
@keyframes party-invite-in {
  from { opacity: 0; transform: translateX(-50%) translateY(-14px); }
  to   { opacity: 1; transform: translateX(-50%) translateY(0); }
}
.party-invite-title { font-size: 17px; margin-bottom: 4px; }
.party-invite-title b { color: #7dd3fc; }
.party-invite-sub { color: #9fb6c9; font-size: 12px; margin-bottom: 12px; }
.party-invite-row { display: flex; gap: 10px; }
.party-invite-row button {
  flex: 1;
  padding: 11px 14px;
  border: 0;
  border-radius: 10px;
  font: inherit;
  cursor: pointer;
  color: #fff;
}
.party-invite-accept { background: linear-gradient(180deg, #22c55e, #16a34a); }
.party-invite-reject { background: rgba(255, 255, 255, .12); }
.party-invite-row button:hover { filter: brightness(1.12); }

/* Roster */
.party-panel {
  position: fixed;
  left: 14px;
  top: 120px;
  z-index: 2147482000;
  min-width: 190px;
  padding: 10px 12px;
  border-radius: 14px;
  background: rgba(14, 14, 22, .92);
  border: 1px solid rgba(255, 255, 255, .12);
  color: #eef2ff;
  font: 600 13px/1.3 system-ui, -apple-system, "Segoe UI", sans-serif;
  pointer-events: auto;
}
.party-panel[hidden] { display: none; }
.party-panel-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 10px;
  margin-bottom: 8px;
  color: #7dd3fc;
  font-size: 11px;
  letter-spacing: .6px;
  text-transform: uppercase;
}
.party-panel-leave {
  border: 0;
  border-radius: 7px;
  padding: 4px 8px;
  background: rgba(255, 255, 255, .12);
  color: #fff;
  font: 600 11px/1 system-ui, sans-serif;
  cursor: pointer;
}
.party-member { display: flex; justify-content: space-between; gap: 10px; padding: 3px 0; }
.party-member.is-leader .party-member-name::before { content: "★ "; color: #fbbf24; }
.party-member.is-away { opacity: .45; }
.party-member-hp { color: #9fb6c9; font-size: 11px; }

/* Party EXP in the corner tray reads blue, so a shared kill is instantly
   distinguishable from a solo one. */
.exp-gain-line.exp-gain-line--party {
  color: #7dd3fc;
  -webkit-text-stroke: 4px #0c3d6b;
  text-shadow: 0 0 16px rgba(56, 189, 248, .85);
}

/* Chat over the head: MapleStory-style, readable by everyone nearby, and visibly
   different from a status line so a shout is not mistaken for a pickup message. */
.bubble--chat {
  background: rgba(255, 255, 255, .97) !important;
  color: #0f172a !important;
  border: 2px solid #38bdf8 !important;
  font-weight: 700;
  max-width: 320px;
  white-space: normal;
  word-break: break-word;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .35), 0 0 22px rgba(56, 189, 248, .45);
}

/* Member rows: name + level, an HP bar, then where they are and the leader's
   controls. serializeParty has always sent hp/maxHp; the panel used to drop them,
   which made the roster a name list rather than a party window. */
.party-panel { width: 210px; }
.party-member { display: block; padding: 6px 0; border-top: 1px solid rgba(255, 255, 255, .06); }
.party-member-top { display: flex; justify-content: space-between; gap: 8px; }
.party-hp-track {
  height: 5px;
  margin: 4px 0 3px;
  border-radius: 3px;
  background: rgba(255, 255, 255, .12);
  overflow: hidden;
}
.party-hp-fill {
  height: 100%;
  border-radius: 3px;
  background: linear-gradient(90deg, #ef4444, #22c55e);
  transition: width 160ms linear;
}
.party-member-foot { display: flex; justify-content: space-between; align-items: center; gap: 6px; }
.party-member-where { color: #9fb6c9; font-size: 10px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.party-member-acts { display: flex; gap: 4px; flex-shrink: 0; }
.party-member-acts button {
  border: 0;
  border-radius: 6px;
  padding: 3px 7px;
  background: rgba(255, 255, 255, .14);
  color: #fff;
  font: 600 10px/1 system-ui, sans-serif;
  cursor: pointer;
}
.party-member-acts button:hover { filter: brightness(1.3); }
