HtmlEmbed
Авторский HTML на странице сайта: карта, форма записи, кнопка оплаты — один файл из
data/web/html/
проекта, показанный inline.
Тип:
leaf
Только веб:
на Flutter-рендере элемент — no-op, приложение ничего не загружает.
HtmlEmbed src:"data/web/html/booking.html" height:520 requiresConsent:"marketing"
Параметры
| Параметр | Тип | Default | Описание |
|---|---|---|---|
src
|
string | — |
Файл вставки
полным путём от корня проекта
:
data/web/html/…
. Внешний адрес не принимается
|
requiresConsent
|
"analytics"
|
"marketing"
|
— | Категория согласия: вставка ждёт разрешения категории (см. Consent ) |
isolate
|
bool | false |
Отдать файл в
iframe
-песочницу вместо разбора в страницу
|
width
,
height
|
длина | — | Размер блока. Высоту задавайте всегда: файл приходит после страницы, и без неё блок сначала пуст, а потом сдвигает всё, что ниже |
Как это исполняется
Компилятор опускает элемент до плейсхолдера
<div data-reeel-html="…">
(плюс
data-consent
при
requiresConsent
). Лоадер рантайма страницы наполняет плейсхолдеры после гидрации, в порядке документа:
<script>
-узлы пересоздаются (вставленные через
innerHTML
они не исполняются), так что скрипты внутри файла работают.
Доменный гейтинг — тот же, что у
Script
: вставка исполняется на адресах самого сайта —
<slug>.reeel.site
и подключённом домене; под корнем платформы (
*.app.reeel.dev
и др.) в HTML нет ни содержимого, ни лоадера.
Изоляция:
isolate:true
По умолчанию файл разбирается
прямо в странице
: его скрипты видят всё, что видит страница, — включая хранилище с токеном
Session
, — а стили текут в обе стороны.
isolate:true
опускает элемент до
<iframe sandbox="allow-scripts allow-forms allow-popups">
: у вставки свой origin, ни хранилища, ни cookie, ни DOM страницы она не видит.
HtmlEmbed src:"data/web/html/chat.html" isolate:true height:480
Цена: рамка не растёт по содержимому (нужен
height
; без
width
она занимает строку целиком), вставка не может рисовать за пределами своего блока и не имеет собственного хранилища. Для всего стороннего — правильный режим.
Примеры
Внешний виджет одним файлом
data/web/html/map_widget.html
HtmlEmbed src:"data/web/html/map_widget.html" height:360
Виджет после согласия
HtmlEmbed src:"data/web/html/booking.html" height:520 requiresConsent:"marketing"
Плейсхолдер ждёт категорию
marketing
так же, как её ждёт
Script
, — и наполняется без перезагрузки, когда посетитель разрешает.
Правила
-
MUST
file— голое имя внутриdata/web/html/; относительные пути и схемы отвергаются, как и уScript src:. -
MUST
Виджет, ставящий сторонние cookie или тянущий трекеры, идёт с
requiresConsent. - MUST NOT Не ждите вставки на платформенном адресе — это гейтинг, а не баг.