Безопасный режим
Безопасный режим — механизм восстановления визуального слоя: он отключает сторонние темы и плагины, чтобы интерфейс всегда возвращался в рабочее состояние.
Что делает безопасный режим
Безопасный режим активируется параметром ?safe=1 в URL. Он обрабатывается
до загрузки любого кода пакетов:
- CSS сторонних тем и оверрайды токенов не добавляются в документ.
- Точки входа сторонних плагинов никогда не выполняются, включая устаревшие точки входа.
- Встроенная тема и встроенный рантайм плагинов остаются активными.
Интерфейс переключается на встроенные светлые и тёмные токены, которые присутствуют всегда. Выход из безопасного режима восстанавливает ранее сохранённое состояние активной темы и плагинов — выход не меняет ваш выбор.
Почему сломанная тема не может заблокировать восстановление
Пользователя защищают от сломанной темы несколько гарантий:
- Предпросмотр до применения — темы предпросматриваются до активации, а установка пакета никогда не активирует его автоматически.
- Безопасный режим до пакетов —
?safe=1обрабатывается до обращения к реестру тем, поэтому даже тема, чей CSS роняет рендерер, никогда не загружается. - Кнопка сброса — действие сброса возвращает встроенную тему, удаляет
ссылки на CSS рантайма и очищает инлайн-оверрайды
--st-*. Удаление активной темы также сбрасывает сохранённый выбор темы. - Темы не могут скрыть Settings — навигационная панель всегда сохраняет доступность элемента Settings, потому что пропущенные системные элементы восстанавливаются в стандартном порядке. В безопасном режиме используется встроенный порядок панели, и переключатель меню остаётся доступным.
- Никакого выполнения кода — темы вообще не содержат JavaScript. Это CSS, токены и декларативный макет, поэтому нет кода темы, который мог бы выполниться до вступления безопасного режима в силу.
Ограничения пакетов тем
Пакет темы никогда не получает доступа к чатам, API-ключам или файловой
системе. Его таблицы стилей проверяются на запрещённые конструкции
(@import, удалённые URL, URL javascript:, expression(), !important и
другие) до принятия, а его токены должны быть безопасными CSS-значениями. В
Theme SDK нет исполняемой точки входа.
Безопасный режим для плагинов
Тот же переключатель отключает сторонние плагины. Песочницы плагинов, изоляция процессов и обеспечиваемая хостом очистка — это слой рантайма; безопасный режим — это переключатель «на всякий случай», который предотвращает загрузку недоверенного кода в первую очередь. Детали со стороны плагинов см. в Песочнице плагинов.
Программная проверка безопасного режима
Пакет @neotavern/theme-sdk экспортирует getSafeModeFromSearch(search), который
разбирает строку поиска URL и возвращает, присутствует ли ?safe=1. Хост
использует его как единственный шлюз перед загрузкой CSS пакетов и оверрайдов
токенов, и та же функция доступна альтернативным хостам.
Об областях оболочки, которые остаются доступными в безопасном режиме, см. Контракт оболочки.