Appearance
HUB Blocks Settings Architecture
Каноничный документ по архитектуре блоков HUB: где хранятся настройки блока, как они читаются/перезаписываются и как блок добавляется в шаблоны без смешивания контуров.
Цель
- Зафиксировать один источник правил для
blocks libraryиtemplate-level settings. - Исключить путаницу между глобальными значениями блока и значениями блока внутри шаблона.
- Дать инженерно-полный workflow для добавления новых блоков.
Термины
Секция: крупная секция страницы (value,program,faqи т.д.).Блок: переиспользуемый компонент библиотеки блоков (feature-enrollment-system-v1).Карточка: внутренний элемент блока (01,02,03,04).Глобальные настройки блока: значения блока в библиотеке блоков.Шаблонные настройки блока: значения того же блока, но в конкретном шаблоне.
Где это в интерфейсе
- Библиотека блоков:
/{locale}/offers/templates/blocks - Админ шаблонов:
/{locale}/admin/templates- для
valueнастройки блока редактируются прямо внутри карточки секцииvalue.
- для
Модель данных Enrollment System
Источник схемы: src/lib/offers/enrollment-block-schema.ts.
Поля блока:
sectionBgcardBgtitleColortextColorindexColorheroTextColorheroIndexColorheroOverlayColorheroOverlayTopOpacity(0..100)heroOverlayBottomOpacity(0..100)heroImageSrc(public path/images/...)card03Bgcard03BgOpacity(0..100)card03TextColor
Upload-поле: enrollHeroImageFile (транспортное поле формы; сохраняется как heroImageSrc после загрузки файла).
Хранилища значений
Глобальный storage блока (библиотека)
- Основной ключ:
hub.blocks.feature-enrollment-system-v1.defaults
- Legacy-ключи (обратная совместимость):
hub.blocks.enrollment_system.section_bghub.blocks.enrollment_system.card_bghub.blocks.enrollment_system.title_colorhub.blocks.enrollment_system.text_colorhub.blocks.enrollment_system.index_color
Template storage блока (внутри шаблона)
- Ключ:
hub.templates.<templateKey>.blocks.feature-enrollment-system-v1
- Пример:
hub.templates.beauty-courses.blocks.feature-enrollment-system-v1
Storage секций шаблона (отдельно от блока)
- Ключ:
hub.templates.<templateKey>.sections
- Используется для
enabled/orderи style-полей секций. - Для секции
valuestyle-поля в админке отключены, чтобы не дублировать источник настроек блока.
Приоритет чтения значений (resolve chain)
Для библиотеки блоков
- Читать
hub.blocks.feature-enrollment-system-v1.defaults. - Если нет/битый JSON: читать legacy-ключи.
- Если и там нет валидных значений:
DEFAULT_ENROLLMENT_BLOCK_SETTINGS.
Для шаблона
- Читать
hub.templates.<templateKey>.blocks.feature-enrollment-system-v1. - Если нет: fallback к текущим глобальным настройкам блока.
- Если глобальные недоступны:
DEFAULT_ENROLLMENT_BLOCK_SETTINGS.
Контуры записи (кто куда пишет)
Глобальные настройки блока
- Action:
saveEnrollmentBlockSettingsAction - Пишет:
hub.blocks.feature-enrollment-system-v1.defaults- legacy-ключи (для совместимости)
Шаблонные настройки блока
- Action:
saveTemplateEnrollmentBlockSettingsAction - Пишет:
hub.templates.<templateKey>.blocks.feature-enrollment-system-v1
Каноничное правило разделения
- Значения в библиотеке блока живут в глобальном storage блока.
- Значения блока внутри шаблона живут в template storage.
- Контуры независимы: запись в одном контуре не должна перезаписывать другой.
- Набор полей один и тот же (схема блока одна), storage-ключи разные.
Таблица: поля -> форма -> storage
| Поле | Input name | Тип | Global key | Template key |
|---|---|---|---|---|
sectionBg | enrollSectionBg | color | hub.blocks.feature-enrollment-system-v1.defaults | hub.templates.<templateKey>.blocks.feature-enrollment-system-v1 |
cardBg | enrollCardBg | color | same JSON key | same JSON key |
titleColor | enrollTitleColor | color | same JSON key | same JSON key |
textColor | enrollTextColor | color | same JSON key | same JSON key |
indexColor | enrollIndexColor | color | same JSON key | same JSON key |
heroTextColor | enrollHeroTextColor | color | same JSON key | same JSON key |
heroIndexColor | enrollHeroIndexColor | color | same JSON key | same JSON key |
heroOverlayColor | enrollHeroOverlayColor | color | same JSON key | same JSON key |
heroOverlayTopOpacity | enrollHeroOverlayTopOpacity | number | same JSON key | same JSON key |
heroOverlayBottomOpacity | enrollHeroOverlayBottomOpacity | number | same JSON key | same JSON key |
heroImageSrc | enrollHeroImageSrc | text | same JSON key | same JSON key |
card03Bg | enrollCard03Bg | color | same JSON key | same JSON key |
card03BgOpacity | enrollCard03BgOpacity | number | same JSON key | same JSON key |
card03TextColor | enrollCard03TextColor | color | same JSON key | same JSON key |
hero image upload | enrollHeroImageFile | file | сохраняется как heroImageSrc после upload | сохраняется как heroImageSrc после upload |
Примечание: legacy-ключи существуют только для части старых color-полей и только в global контуре.
Автосохранение
EnrollmentBlockSettingsEditor:- autosave по
onInputCapture/onChangeCapture; - debounce submit (
~450ms); - file change отправляется сразу.
- autosave по
TemplateSectionsEditor:- autosave секций по цветам/enable/reorder;
- для
valueсекции style controls отключены.
Как добавить новый блок в шаблон (стандарт)
- Создать блок в
src/components/blocks/**. - Зарегистрировать в
src/components/blocks/registry.ts. - Вывести в библиотеке блоков (
/{locale}/offers/templates/blocks). - Добавить схему настроек блока (типы, поля, defaults, normalize).
- Реализовать чтение/запись:
- global read/write;
- template read/write.
- Подключить блок в шаблонной странице (например,
PremiumTemplatePage). - Зафиксировать storage keys, resolve chain и write flow в этом документе.
Smoke-check после изменений
- Изменить поле в библиотеке блоков -> проверить, что changed только global контур.
- Изменить то же поле в админке шаблона -> проверить, что changed только template контур.
- Проверить upload изображения в обоих контурах.
- Проверить, что секция
valueне имеет конкурирующих style-полей секции.