9199427dfd
Раньше: каждая глава хранила XP отдельно (algebra8_ch1_xp + algebra8_ch2_xp), формулы уровня были разные (дискретная таблица в ch1, формула sqrt в ch2), визуально XP-карты различались. Теперь: - Один ключ localStorage: 'algebra8_xp' для обеих глав. - При первой загрузке (в любой главе) — single-shot миграция: если новый ключ отсутствует, суммирует старые ch1 + ch2 и сохраняет под единый ключ. Старые ключи не удаляются (на всякий). - Единая таблица уровней XP_LEVELS = [0, 50, 120, 220, 350, 520, 740, 1000, 1300, 1700, 2200] (11 уровней, MAX = Ур. 11). - Единые функции calcLevel(xp) и _xpForLevel(lv). - XP-карта в сайдбаре главы 2 теперь идентична главе 1: градиент acc→pri-soft, .xp-card-title, .xp-bar, .xp-fill, .xp-nums. - Hero badge «★ Ур. N · NN XP» добавлен в hero обоих глав. - addXp в ch2: при повышении уровня — popup с номером уровня + confetti. - addXp в ch1: refreshProgressUI вызывается, чтобы обновлять hero badge сразу после начисления.