diff --git a/js/api.js b/js/api.js index 6031eba..3bdd26d 100644 --- a/js/api.js +++ b/js/api.js @@ -903,7 +903,14 @@ function _applyFeatureCss(feats) { JSON.parse(localStorage.getItem('ls_examhide') || '[]') .forEach(h => sels.push(`[href="${h}"]`)); } catch { /* пусто */ } - const css = sels.length ? sels.join(',') + '{display:none !important}' : ''; + let css = sels.length ? sels.join(',') + '{display:none !important}' : ''; + // Геймификация: дублируем kill-switch в инъекцию — для страниц БЕЗ ls.css. + // Учебники (frontend/textbooks/*.html) грузят api.js, но НЕ ls.css, поэтому правила + // .no-gamification из ls.css туда не доходят, и встроенная XP-механика (data-gamified, + // #ach-popup) оставалась видимой. Инъекция работает на любой странице с api.js. + if (feats && feats.gamification === false) { + css += '.no-gamification [data-gamified],.no-gamification #ach-popup{display:none!important}'; + } let el = document.getElementById('ls-feat-hide'); if (!el) { el = document.createElement('style'); @@ -921,6 +928,14 @@ try { _applyFeatureCss(_cachedFeats); // применит и кэш фич, и кэш скрытых exam-prep ссылок } catch { /* нет кэша / приватный режим — просто ждём async */ } +/* Авторитетно подтянуть фичи на страницах БЕЗ сайдбара (учебники, embed): там + sidebar.js/hideDisabledFeatures не вызывают loadFeatures, и кэш мог устареть. + loadFeatures() кэширует in-memory (дубль-вызов = один fetch) и сам зовёт _applyFeatureCss. + Только для залогиненных — иначе на /login apiFetch поймает 401 и зациклит редирект. */ +try { + if (isLoggedIn()) { loadFeatures().catch(() => {}); } +} catch { /* defensive */ } + /* Прячет группы сайдбара (.sb-group), у которых не осталось ни одного видимого пункта, чтобы не висел пустой заголовок-аккордеон (напр. «Практика и игры», когда все модули отключены). Зовётся после построения сайдбара и после hideDisabledFeatures. */