// packs.jsx — card-pack opening with epic reveal animation + collection screen

// ── CSS ──────────────────────────────────────────────────────
const __PACKS_CSS = `
@keyframes pack-shake {
  0%, 100% { transform: translate(0, 0) rotate(0deg); }
  10% { transform: translate(-2px, -1px) rotate(-1deg); }
  20% { transform: translate(2px, 1px) rotate(1.5deg); }
  30% { transform: translate(-3px, 1px) rotate(-2deg); }
  40% { transform: translate(3px, -2px) rotate(2deg); }
  50% { transform: translate(-2px, 2px) rotate(-1.5deg); }
  60% { transform: translate(2px, -1px) rotate(1deg); }
  70% { transform: translate(-3px, -1px) rotate(-2.5deg); }
  80% { transform: translate(3px, 2px) rotate(2deg); }
  90% { transform: translate(-1px, -2px) rotate(-1deg); }
}
@keyframes pack-burst {
  0%   { transform: scale(1); opacity: 1; }
  50%  { transform: scale(1.4); opacity: 1; filter: brightness(2); }
  100% { transform: scale(2.8); opacity: 0; filter: brightness(3); }
}
@keyframes pack-glow-pulse {
  0%, 100% { box-shadow: 0 0 30px var(--p1, #6C3FE8), 0 0 80px var(--p2, #A78BFA); }
  50%      { box-shadow: 0 0 60px var(--p1, #6C3FE8), 0 0 140px var(--p2, #A78BFA); }
}
@keyframes card-fly {
  0%   { transform: translate(0, 0) scale(0.4) rotate(var(--rotS, 0deg)); opacity: 0; }
  50%  { opacity: 1; }
  100% { transform: var(--card-rest); opacity: 1; }
}
@keyframes card-flip-in {
  0%   { transform: var(--card-rest) rotateY(180deg); }
  100% { transform: var(--card-rest) rotateY(0deg); }
}
@keyframes legendary-rays {
  from { transform: rotate(0deg); } to { transform: rotate(360deg); }
}
@keyframes legendary-bg-pulse {
  0%, 100% { opacity: 0.3; }
  50%      { opacity: 0.7; }
}
@keyframes rip-line {
  0% { transform: scaleX(0); }
  100% { transform: scaleX(1); }
}

.pack-stage {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  z-index: 200;
  overflow: hidden;
  background:
    radial-gradient(ellipse 80% 60% at 50% 50%, var(--p2, #A78BFA), transparent 60%),
    radial-gradient(ellipse at 50% 50%, var(--p1, #6C3FE8) 0%, #000 70%, #000 100%);
  animation: fade-in 280ms;
}
.pack-stage::before {
  content: ''; position: absolute; inset: 0;
  background: repeating-conic-gradient(from 0deg at 50% 50%,
    var(--p1, #6C3FE8) 0deg 8deg, transparent 8deg 16deg);
  opacity: 0.18;
  animation: legendary-rays 18s linear infinite;
}

.pack-card {
  position: relative;
  width: 240px; height: 340px;
  border-radius: 18px;
  background:
    linear-gradient(180deg, rgba(255,255,255,0.18), transparent 30%),
    linear-gradient(160deg, var(--p1, #6C3FE8) 0%, var(--p2, #A78BFA) 60%, #000 100%);
  border: 2px solid rgba(255,255,255,0.4);
  box-shadow:
    0 0 40px var(--p2, #A78BFA),
    inset 0 0 60px rgba(0,0,0,0.4),
    inset 0 1px 0 rgba(255,255,255,0.3);
  display: flex; flex-direction: column; align-items: center; justify-content: space-between;
  padding: 30px 16px 22px;
  color: #fff;
  cursor: pointer;
  animation: pack-glow-pulse 2.4s ease-in-out infinite;
  z-index: 2;
}
.pack-card.shaking { animation: pack-shake 0.6s linear, pack-glow-pulse 2.4s ease-in-out infinite; }
.pack-card.bursting::after {
  content: ''; position: absolute; inset: -10px;
  border-radius: 24px;
  background: radial-gradient(circle, #fff, var(--p2, #A78BFA));
  animation: pack-burst 600ms ease-out forwards;
  z-index: 5;
}
.pack-card .corner-tl, .pack-card .corner-br {
  position: absolute; padding: 2px 8px; border-radius: 9999px;
  background: rgba(0,0,0,0.4); font-family: var(--font-mono);
  font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  border: 1px solid rgba(255,255,255,0.3);
}
.pack-card .corner-tl { top: 12px; left: 12px; }
.pack-card .corner-br { bottom: 12px; right: 12px; background: var(--p1); border-color: rgba(255,255,255,0.5); }
.pack-card h2 {
  font-family: var(--font-display);
  font-weight: 900;
  font-size: 30px;
  letter-spacing: 0.02em;
  text-align: center;
  margin: 0;
  text-transform: uppercase;
  text-shadow: 0 0 12px rgba(255,255,255,0.5);
  line-height: 1;
}
.pack-card .silhouettes {
  font-size: 56px;
  letter-spacing: -10px;
  filter: drop-shadow(0 0 12px rgba(255,255,255,0.4));
  user-select: none;
}
.pack-card .count-pill {
  background: rgba(0,0,0,0.5);
  border: 1px solid rgba(255,255,255,0.4);
  border-radius: 9999px;
  padding: 5px 12px;
  display: flex; gap: 8px; align-items: center;
  font-family: var(--font-mono);
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-weight: 700;
}
.pack-card .count-pill b {
  background: rgba(255,255,255,0.2);
  width: 22px; height: 22px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 13px;
  border: 1px solid rgba(255,255,255,0.5);
}

.pack-rip {
  position: absolute;
  top: 50%; left: 0; right: 0;
  height: 2px; background: #fff;
  box-shadow: 0 0 12px #fff, 0 0 28px #fff;
  transform-origin: left;
  animation: rip-line 220ms ease-out forwards;
  opacity: 0.95;
}

.pack-cards-fan {
  position: relative;
  display: flex; gap: 18px;
  align-items: center; justify-content: center;
  perspective: 1400px;
}

.pack-reveal-card {
  width: 170px; height: 250px;
  border-radius: 14px;
  background: linear-gradient(160deg, var(--cg1, #6C3FE8), var(--cg2, #A78BFA));
  border: 1.5px solid rgba(255,255,255,0.6);
  position: relative;
  transform-style: preserve-3d;
  cursor: pointer;
  animation: card-fly 600ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
  animation-delay: var(--delay, 0ms);
  transition: transform 250ms, box-shadow 250ms;
  --card-rest: translate(0, 0) scale(1) rotate(0deg);
}
.pack-reveal-card:hover { transform: translateY(-8px) scale(1.04); box-shadow: 0 0 40px var(--cg2); }
.pack-reveal-card[data-flipped="1"] .face-back { transform: rotateY(180deg); }
.pack-reveal-card[data-flipped="1"] .face-front { transform: rotateY(0deg); }
.pack-reveal-card .face-front, .pack-reveal-card .face-back {
  position: absolute; inset: 0;
  border-radius: 14px;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  transition: transform 600ms cubic-bezier(0.5, 0, 0.5, 1.2);
  display: flex; flex-direction: column;
  overflow: hidden;
}
.pack-reveal-card .face-back {
  transform: rotateY(0deg);
  background: linear-gradient(135deg, #2a1a4a, #1a0b2e);
  display: grid; place-items: center;
}
.pack-reveal-card .face-back::before {
  content: '';
  position: absolute; inset: 0;
  background: repeating-conic-gradient(from 0deg at 50% 50%,
    rgba(255,255,255,0.07) 0deg 8deg, transparent 8deg 16deg);
}
.pack-reveal-card .face-back .logo {
  font-family: var(--font-display);
  font-weight: 900;
  font-size: 60px;
  background: linear-gradient(135deg, #FBBF24, #F472B6, #A78BFA);
  -webkit-background-clip: text; background-clip: text; color: transparent;
  filter: drop-shadow(0 0 10px #FBBF2466);
}
.pack-reveal-card .face-front {
  transform: rotateY(-180deg);
  background:
    radial-gradient(ellipse 70% 50% at 50% 0%, rgba(255,255,255,0.25), transparent 60%),
    linear-gradient(180deg, var(--cg1), var(--cg2));
  padding: 12px;
}
.pack-reveal-card .num-badge {
  position: absolute; top: 8px; left: 8px;
  background: rgba(0,0,0,0.5);
  border-radius: 9999px;
  width: 26px; height: 26px;
  display: grid; place-items: center;
  font-family: var(--font-mono); font-weight: 700; font-size: 12px;
  color: #fff;
  border: 1px solid rgba(255,255,255,0.4);
}
.pack-reveal-card .rar-badge {
  position: absolute; top: 8px; right: 8px;
  background: rgba(0,0,0,0.4);
  padding: 2px 8px;
  border-radius: 9999px;
  font-family: var(--font-mono); font-size: 9px; font-weight: 700;
  letter-spacing: 0.08em; text-transform: uppercase;
  color: #fff;
  border: 1px solid rgba(255,255,255,0.5);
}
.pack-reveal-card .mascot-slot {
  flex: 1;
  display: grid; place-items: center;
  margin-top: 28px;
}
.pack-reveal-card .info {
  text-align: center;
  padding: 0 4px 6px;
}
.pack-reveal-card .info .nm {
  font-family: var(--font-display); font-weight: 800;
  color: #fff; font-size: 15px; letter-spacing: -0.01em;
  text-shadow: 0 1px 0 rgba(0,0,0,0.3);
}
.pack-reveal-card .info .ab {
  font-family: var(--font-mono); font-size: 9.5px;
  color: rgba(255,255,255,0.8);
  text-transform: uppercase; letter-spacing: 0.08em;
  margin-top: 2px;
}
.pack-reveal-card[data-rarity="legendary"] {
  border: 1.5px solid #FBBF24;
  box-shadow: 0 0 40px #FBBF24, 0 0 80px #F472B655;
}
.pack-reveal-card[data-rarity="epic"] {
  border: 1.5px solid #A78BFA;
  box-shadow: 0 0 30px #A78BFA, 0 0 60px #A78BFA55;
}
.pack-reveal-card[data-rarity="rare"] {
  border: 1.5px solid #60A5FA;
  box-shadow: 0 0 24px #60A5FA88;
}
.pack-reveal-card[data-rarity="common"] {
  box-shadow: 0 4px 16px rgba(0,0,0,0.4);
}
.pack-reveal-card[data-new="1"]::after {
  content: 'NEW';
  position: absolute; top: -8px; right: -8px;
  background: #22D3A3;
  color: #0F172A;
  font-family: var(--font-mono); font-weight: 800; font-size: 10px;
  padding: 3px 7px;
  border-radius: 6px;
  letter-spacing: 0.08em;
  box-shadow: 0 0 14px #22D3A3;
  z-index: 5;
}

.pack-actions {
  margin-top: 28px;
  display: flex; gap: 12px;
  align-items: center; justify-content: center;
  position: relative;
  z-index: 3;
}
.pack-actions .btn {
  font-size: 13px;
  padding: 10px 20px;
}

.pack-prompt {
  position: absolute; top: 10%; left: 50%; transform: translateX(-50%);
  text-align: center;
  z-index: 3;
}
.pack-prompt .eyebrow {
  color: rgba(255,255,255,0.7);
  font-size: 11px;
}
.pack-prompt h1 {
  font-family: var(--font-display);
  font-weight: 900;
  font-size: 36px;
  color: #fff;
  margin: 8px 0 0;
  letter-spacing: -0.02em;
  text-shadow: 0 0 20px var(--p2);
}
.pack-prompt p {
  color: rgba(255,255,255,0.8);
  font-size: 13px;
  margin: 6px 0 0;
}

/* Collection screen */
.coll-tabs {
  display: flex; gap: 6px;
  margin-bottom: 16px;
  background: var(--bg-app-2);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 4px;
  width: fit-content;
}
.coll-tabs button {
  padding: 7px 14px;
  border-radius: calc(var(--r-md) - 2px);
  font-size: 12.5px;
  font-weight: 500;
  color: var(--text-tertiary);
  font-family: var(--font-body);
  background: transparent; border: 0;
  transition: background 120ms, color 120ms;
}
.coll-tabs button[data-active="1"] {
  background: var(--accent-soft);
  color: var(--text-primary);
}
.pack-shelf {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
.pack-shelf .pack-card {
  width: 100%; height: 280px;
  margin: 0;
  cursor: pointer;
  animation: none;
}
.pack-shelf .pack-card:hover { transform: translateY(-6px) scale(1.02); }
.pack-shelf .pack-card .silhouettes { font-size: 44px; }
.pack-shelf .pack-card h2 { font-size: 22px; }
.pack-shelf .pack-card .meta {
  font-family: var(--font-mono); font-size: 10px;
  color: rgba(255,255,255,0.7);
  text-transform: uppercase; letter-spacing: 0.06em;
  text-align: center;
  margin-top: 4px;
}
`;
if (typeof document !== 'undefined' && !document.getElementById('packs-css')) {
  const s = document.createElement('style');
  s.id = 'packs-css';
  s.textContent = __PACKS_CSS;
  document.head.appendChild(s);
}

// ─────────────────────────────────────────────────────────────
// Closed pack visual (used on shelf)
// ─────────────────────────────────────────────────────────────
function PackVisual({ packId, owned = 0, onClick, large = false }) {
  const meta = PACK_META[packId];
  const ids = MASCOTS.filter(m => m.pack === packId).map(m => m.id);
  return (
    <div className="pack-card" style={{ '--p1': meta.color1, '--p2': meta.color2 }} onClick={onClick}>
      <span className="corner-tl">5×</span>
      <span className="corner-br">{meta.price}</span>
      <h2>{meta.name.split(' ').map((w, i) => <div key={i}>{w}</div>)}</h2>
      <div className="silhouettes">
        {ids.slice(0, 5).map((id, i) => {
          const m = MASCOT_BY_ID[id];
          return <span key={id} style={{ filter: 'brightness(0.6)' }}>
            {({ spectr: '◆', lumen: '✦', orion: '○', balbot: '▢', zhar: '▲', mimi: '♥', vortex: '➤', magnat: '$', noir: '◯', champion: '★', widow: '♛', demon: '☉', spark: '⚡' })[id]}
          </span>;
        })}
      </div>
      <div className="count-pill">
        <b>5</b>
        <span>коллекционных карт</span>
      </div>
      {owned > 0 && <div className="meta">У тебя: {owned}</div>}
    </div>
  );
}

// ─────────────────────────────────────────────────────────────
// Pack opening modal — full reveal animation
// ─────────────────────────────────────────────────────────────
function PackOpeningModal({ packId, contentIds, onClose, onUnlock, onClaim }) {
  const meta = PACK_META[packId];
  const cards = contentIds.map(id => MASCOT_BY_ID[id]).filter(Boolean);
  const [phase, setPhase] = React.useState('intro'); // intro → shaking → bursting → reveal → done
  const [flipped, setFlipped] = React.useState({}); // id -> bool
  const [allFlipped, setAllFlipped] = React.useState(false);

  // confetti on legendary
  React.useEffect(() => {
    if (phase === 'reveal' && typeof confetti === 'function') {
      const hasLegendary = cards.some(c => c.rarity === 'legendary');
      const hasEpic = cards.some(c => c.rarity === 'epic');
      if (hasLegendary) {
        confetti({ particleCount: 220, spread: 130, colors: ['#FBBF24', '#F472B6', '#A78BFA', '#fff'], origin: { y: 0.5 } });
      } else if (hasEpic) {
        confetti({ particleCount: 140, spread: 90, colors: ['#A78BFA', '#F472B6'], origin: { y: 0.5 } });
      }
    }
  }, [phase, cards]);

  const onPackClick = () => {
    if (phase !== 'intro') return;
    setPhase('shaking');
    setTimeout(() => setPhase('bursting'), 600);
    setTimeout(() => setPhase('reveal'), 1100);
  };

  const flipOne = (id) => {
    setFlipped(f => {
      const next = { ...f, [id]: true };
      const all = cards.every(c => next[c.id]);
      if (all) {
        setAllFlipped(true);
        // notify parent about unlocks
        onUnlock?.(contentIds);
        // extra confetti on full reveal
        if (typeof confetti === 'function') {
          confetti({ particleCount: 80, spread: 70, colors: ['#22D3A3', '#FBBF24'], origin: { y: 0.45 } });
        }
      }
      return next;
    });
  };

  const flipAll = () => {
    const next = {};
    cards.forEach(c => { next[c.id] = true; });
    setFlipped(next);
    setAllFlipped(true);
    onUnlock?.(contentIds);
    if (typeof confetti === 'function') {
      const hasLeg = cards.some(c => c.rarity === 'legendary');
      confetti({
        particleCount: hasLeg ? 200 : 120,
        spread: 120,
        colors: hasLeg ? ['#FBBF24', '#F472B6', '#fff'] : ['#A78BFA', '#22D3A3', '#fff'],
        origin: { y: 0.5 },
      });
    }
  };

  return (
    <div className="pack-stage" style={{ '--p1': meta.color1, '--p2': meta.color2 }}>
      {/* Prompt */}
      {phase === 'intro' && (
        <div className="pack-prompt">
          <div className="eyebrow">Открой свой пак</div>
          <h1>{meta.name}</h1>
          <p>Тапни по упаковке. Внутри — 5 героев.</p>
        </div>
      )}
      {phase === 'reveal' && !allFlipped && (
        <div className="pack-prompt">
          <div className="eyebrow">Переверни карты</div>
          <h1 style={{ fontSize: 28 }}>Что выпало?</h1>
        </div>
      )}
      {allFlipped && (
        <div className="pack-prompt">
          <div className="eyebrow">5 героев разблокировано</div>
          <h1 style={{ fontSize: 32 }}>Готово!</h1>
        </div>
      )}

      {/* Close button always */}
      <button className="btn ghost" onClick={onClose}
              style={{ position: 'absolute', top: 16, right: 16, zIndex: 50, background: 'rgba(0,0,0,0.4)', color: '#fff' }}>
        Закрыть
      </button>

      {/* Pack card or fanned reveal cards */}
      {(phase === 'intro' || phase === 'shaking' || phase === 'bursting') && (
        <div className={`pack-card ${phase === 'shaking' ? 'shaking' : ''} ${phase === 'bursting' ? 'bursting' : ''}`}
             style={{ '--p1': meta.color1, '--p2': meta.color2 }}
             onClick={onPackClick}>
          <span className="corner-tl">5×</span>
          <span className="corner-br">{meta.price}</span>
          <h2>{meta.name.split(' ').map((w, i) => <div key={i}>{w}</div>)}</h2>
          <div className="silhouettes">
            {cards.slice(0, 5).map((c, i) => (
              <span key={c.id} style={{ filter: 'brightness(0.6)' }}>
                {({ spectr: '◆', lumen: '✦', orion: '○', balbot: '▢', zhar: '▲', mimi: '♥', vortex: '➤', magnat: '$', noir: '◯', champion: '★', widow: '♛', demon: '☉', spark: '⚡' })[c.id]}
              </span>
            ))}
          </div>
          <div className="count-pill"><b>5</b><span>карт внутри</span></div>
          {phase === 'shaking' && <div className="pack-rip"></div>}
        </div>
      )}

      {phase === 'reveal' && (
        <div style={{ paddingTop: 80 }}>
          <div className="pack-cards-fan">
            {cards.map((c, i) => {
              const rar = RARITY_META[c.rarity];
              const isFlipped = !!flipped[c.id];
              return (
                <div key={c.id}
                     className="pack-reveal-card"
                     data-flipped={isFlipped ? '1' : '0'}
                     data-rarity={c.rarity}
                     data-new={isFlipped ? '1' : '0'}
                     style={{
                       '--delay': `${i * 100}ms`,
                       '--rotS': `${(i - 2) * 8}deg`,
                       '--card-rest': `translate(0, 0) scale(1) rotate(${(i - 2) * 4}deg)`,
                       '--cg1': c.color, '--cg2': c.glow,
                     }}
                     onClick={() => flipOne(c.id)}>
                  <div className="face-back">
                    <div className="logo">К</div>
                  </div>
                  <div className="face-front">
                    <span className="num-badge">{i + 1}</span>
                    <span className="rar-badge">{rar.label}</span>
                    <div className="mascot-slot">
                      <Mascot id={c.id} size={92} emotion="idle" aura={false} />
                    </div>
                    <div className="info">
                      <div className="nm">{c.name}</div>
                      <div className="ab">Ability: {c.power}</div>
                    </div>
                  </div>
                </div>
              );
            })}
          </div>
          <div className="pack-actions">
            {!allFlipped && <button className="btn ghost" onClick={flipAll} style={{ background: 'rgba(255,255,255,0.1)', color: '#fff' }}>Перевернуть все</button>}
            {allFlipped && <button className="btn primary" onClick={onClaim || onClose} style={{ background: '#22D3A3', borderColor: '#22D3A3' }}>Забрать в коллекцию</button>}
          </div>
        </div>
      )}
    </div>
  );
}

// ─────────────────────────────────────────────────────────────
// Collection screen
// ─────────────────────────────────────────────────────────────
function CollectionScreen({ unlockedIds, activeMascotId, onSelectMascot, onOpenPack, onClaimAchievement }) {
  const [tab, setTab] = React.useState('mascots');

  // Achievements that grant packs
  const achievements = [
    { id: 'ach_streak_7',  label: 'Стрик 7 дней',  done: true,  reward: 'starter', mascot: null,         icon: '🔥' },
    { id: 'ach_streak_30', label: 'Стрик 30 дней', done: false, progress: '23/30', reward: 'premium', mascot: 'vortex', icon: '⚡' },
    { id: 'ach_wishes_5',  label: '5 завершённых желаний', done: false, progress: '3/5', reward: 'premium', mascot: 'mimi', icon: '🎯' },
    { id: 'ach_level_5',   label: 'Уровень 5+',  done: false, progress: 'LVL 4',  reward: 'battle', mascot: 'champion', icon: '🏔️' },
    { id: 'ach_finance_3', label: '3 финансовых цели', done: false, progress: '1/3', reward: 'premium', mascot: 'magnat', icon: '💰' },
  ];

  return (
    <div className="main no-rail" style={{ padding: '20px 28px 32px' }}>
      <div className="main-col">
        {/* Hero */}
        <div className="spread mb-4">
          <div>
            <div className="eyebrow">Коллекция</div>
            <div className="ttl-xl mt-2">Твои компаньоны</div>
            <div className="dim2 mt-2" style={{ maxWidth: 520, fontSize: 14 }}>
              {unlockedIds.length} из {MASCOTS.length} героев · каждый меняет тему всего приложения
            </div>
          </div>
          <div className="row" style={{ gap: 8 }}>
            <span className="chip" style={{ '--zc': 'var(--gold)', background: 'rgba(245,166,35,0.15)', color: 'var(--gold-2)', borderColor: 'var(--gold)' }}>
              🔥 23 дн.
            </span>
            <span className="chip" style={{ '--zc': 'var(--accent-2)', background: 'var(--accent-soft)', color: 'var(--accent-2)' }}>
              LVL {ME.level}
            </span>
          </div>
        </div>

        {/* Tabs */}
        <div className="coll-tabs">
          <button data-active={tab === 'mascots' ? '1' : '0'} onClick={() => setTab('mascots')}>Герои</button>
          <button data-active={tab === 'packs' ? '1' : '0'} onClick={() => setTab('packs')}>Паки</button>
          <button data-active={tab === 'achievements' ? '1' : '0'} onClick={() => setTab('achievements')}>Достижения</button>
        </div>

        {/* Mascots tab */}
        {tab === 'mascots' && (
          <div style={{ display: 'grid', gridTemplateColumns: 'repeat(5, 1fr)', gap: 14 }}>
            {MASCOTS.map(m => {
              const locked = !unlockedIds.includes(m.id);
              const rar = RARITY_META[m.rarity];
              return (
                <div key={m.id} className="mascot-card"
                     data-active={activeMascotId === m.id ? '1' : '0'}
                     data-locked={locked ? '1' : '0'}
                     style={{ '--m-glow': locked ? rar.glow : m.glow }}
                     onClick={() => { if (!locked) onSelectMascot(m.id); }}>
                  <span className="rarity-tag">{rar.label}</span>
                  {activeMascotId === m.id && !locked && <span className="ribbon">Активен</span>}
                  <div style={{ display: 'grid', placeItems: 'center', minHeight: 110 }}>
                    <Mascot id={m.id} size={100} emotion={activeMascotId === m.id ? 'excited' : 'idle'} aura />
                  </div>
                  <div style={{ fontFamily: 'var(--font-display)', fontWeight: 800, fontSize: 16, marginTop: 10, letterSpacing: '-0.01em' }}>
                    {m.name}
                  </div>
                  <div className="dim" style={{ fontSize: 10.5, marginTop: 2 }}>«{m.type}»</div>
                  <div className="dim2" style={{ fontSize: 11, marginTop: 6, minHeight: 28 }}>{m.power}</div>
                  {!locked && (
                    <button className="btn primary"
                            style={{ width: '100%', justifyContent: 'center', fontSize: 11, marginTop: 8, padding: '6px 8px',
                                     background: m.color, borderColor: m.color,
                                     boxShadow: `0 0 calc(16px * var(--glow-mult)) ${m.glow}66` }}
                            onClick={(e) => { e.stopPropagation(); onSelectMascot(m.id); }}>
                      {activeMascotId === m.id ? '✓ Активна тема' : 'Применить тему'}
                    </button>
                  )}
                  {locked && (
                    <div className="locked-overlay">
                      <div>
                        <b>🔒 Заблокирован</b>
                        <div>{m.unlock?.label || 'В Премиум-паке'}</div>
                      </div>
                    </div>
                  )}
                </div>
              );
            })}
          </div>
        )}

        {/* Packs tab */}
        {tab === 'packs' && (
          <div>
            <div className="pack-shelf">
              {Object.keys(PACK_META).map(pid => (
                <PackVisual key={pid} packId={pid} onClick={() => onOpenPack(pid)} />
              ))}
            </div>
            <div className="card mt-4" style={{ background: 'linear-gradient(90deg, var(--accent-soft), transparent 60%)', border: '1px solid var(--accent)' }}>
              <div className="row" style={{ alignItems: 'center' }}>
                <div style={{ flex: 1 }}>
                  <div className="eyebrow" style={{ color: 'var(--accent-2)' }}>Как работают паки</div>
                  <div className="ttl-md mt-2">Получай паки бесплатно за достижения</div>
                  <p className="dim2 mt-2" style={{ fontSize: 13 }}>
                    Стрик 7 дней — стартер. Стрик 30 — премиум. Уровень 5 — баттл-пак. Можно также купить премиум-паки за накопленные XP.
                  </p>
                </div>
                <button className="btn primary" onClick={() => setTab('achievements')}>Мои достижения →</button>
              </div>
            </div>
          </div>
        )}

        {/* Achievements tab */}
        {tab === 'achievements' && (
          <div className="col" style={{ gap: 10 }}>
            {achievements.map(a => {
              const pmeta = PACK_META[a.reward];
              return (
                <div key={a.id} className="card row" style={{ alignItems: 'center', gap: 16, padding: 16 }}>
                  <div style={{
                    width: 56, height: 56,
                    borderRadius: 'var(--r-md)',
                    background: `linear-gradient(135deg, ${pmeta.color1}, ${pmeta.color2})`,
                    display: 'grid', placeItems: 'center',
                    fontSize: 26,
                    boxShadow: `0 0 calc(16px * var(--glow-mult)) ${pmeta.color2}55`,
                  }}>{a.icon}</div>
                  <div style={{ flex: 1 }}>
                    <div className="row" style={{ gap: 8 }}>
                      <div style={{ fontFamily: 'var(--font-display)', fontWeight: 700, fontSize: 15 }}>{a.label}</div>
                      <span className="chip" style={{ '--zc': pmeta.color2, background: `${pmeta.color2}22`, color: pmeta.color2, borderColor: pmeta.color2, fontSize: 10 }}>
                        награда: {pmeta.name}
                      </span>
                    </div>
                    <div className="dim mt-2" style={{ fontSize: 12 }}>
                      {a.done ? '✓ Получено' : `Прогресс: ${a.progress}`}
                    </div>
                  </div>
                  {a.done ? (
                    <button className="btn primary" onClick={() => onOpenPack(a.reward)}>Открыть пак</button>
                  ) : (
                    <div className="dim mono" style={{ fontSize: 11 }}>заблокировано</div>
                  )}
                </div>
              );
            })}
          </div>
        )}
      </div>
    </div>
  );
}

Object.assign(window, { PackVisual, PackOpeningModal, CollectionScreen });
