diff --git a/frontend/textbooks.html b/frontend/textbooks.html
index 2f2923e..7efa342 100644
--- a/frontend/textbooks.html
+++ b/frontend/textbooks.html
@@ -479,6 +479,15 @@
/* Фаза 5: открыть связанную симуляцию из карточки учебника (не уходя в учебник). */
function openLabSim(simId, ev) {
if (ev) ev.stopPropagation();
+ // Страховка: если «Лаборатория» отключена — не открываем (кнопка и так скрыта
+ // kill-switch'ем). Админ имеет доступ всегда (admin-override).
+ try {
+ const u = LS.getUser && LS.getUser();
+ if (!(u && u.role === 'admin')) {
+ const f = JSON.parse(localStorage.getItem('ls_feat_cache') || 'null');
+ if (f && f.lab === false) { if (LS.toast) LS.toast('Лаборатория отключена', 'warn'); return; }
+ }
+ } catch (e) { /* нет кэша — открываем как раньше */ }
location.href = '/lab?sim=' + encodeURIComponent(simId);
}
window.openLabSim = openLabSim;
diff --git a/js/api.js b/js/api.js
index 3bdd26d..b672a90 100644
--- a/js/api.js
+++ b/js/api.js
@@ -866,7 +866,10 @@ const FEATURE_HREFS = {
матчит, поэтому прячем по СТАБИЛЬНОМУ id #hc-lab (аналогично pet/чтение). */
const FEATURE_WIDGETS = {
flashcards: ['#w-flashcard'],
- lab: ['#hc-lab'],
+ // #hc-lab — hero-карточка дашборда; .tb-lab-btn — кнопка «открыть связанную
+ // симуляцию» на карточках каталога учебников (openLabSim → /lab?sim=…). Это
+ //