Intake: req-097.md Decisão: DEC-093 Validação: VALIDATION-CHECKLIST.md#batch-097 Evidência do defeito: temp/html-output.html
Diagnóstico da evidência (Fix 1)
No HTML de saída há dois <object>: um dentro de #c2f-page-content (width:500px) e outro fora dele,
como último filho de #c2f-layout-root (width:100%). Ou seja, uma das cópias foi salva no LAYOUT.
Causa-raiz: no Live Editor o contentRoot do motor é #c2f-layout-root (a edição cobre layout + conteúdo).
insertCustomHtml() — e a inserção do painel "+" quando não há alvo — usa contentRoot.appendChild() como
fallback, então o elemento nasce fora do #c2f-page-content e o performSave o grava em layouts.html.
Como o layout é compartilhado por todas as páginas e pela própria página da Editbar (dashboard-site-toolbar,
renderizada dentro do iframe da barra), o mesmo embed passa a aparecer 2–3 vezes na tela e "vaza" para dentro
da barra.
Fatiamento
PARTE I — Correções (prioridade alta)
-
Fix 1 — duplicação/vazamento:
-
insertionRoot(): quando existe#c2f-page-contentdentro da raiz editável, toda inserção sem alvo vai para o CONTEÚDO da página, nunca para a raiz do layout. -
isEditorOwnedreconhece os elementos de sistema do Live Editor (#c2f-site-toolbar,#c2f-device-preview,#c2f-save-loader), o que blinda de uma só vezwrapEmbeds,resolveEditable,findEditableFromPointeextractUserHtml/isUserContentNode. -
Extração idempotente:
extractUserHtmllimpa o [REDACTED] PDF.js (canvas/toolbar renderizados + atributo de prontidão) e remove resíduos órfãos de invólucro (escudo/badge/alças) que tenham sido persistidos.
-
-
Fix 2 — interatividade no site publicado: escudo e
pointer-eventspassam a existir SÓ enquanto o editor está habilitado (disable()desembrulha o DOM vivo,enable()re-envolve). O markup persistido dos embeds nasce composition:relative;z-index:1para não ficar sob camadas decorativas absolutas do template. -
Fix 3 — z-index:
#c2f-he-embed-modalem1000000; overlay do seletor de arquivos em1000060. -
Fix 4 — preview ao vivo do Motor B:
ensurePdfViewer()carregainterface/pdf-viewer.jssob demanda e disparaconn2flowPdfViewerInit()ao aplicar o modal, ao envolver um contêiner novo e noapplyState.
PARTE II — Usabilidade
-
Dropdown "Página": "Editar Avançado" sempre aponta para
/admin-paginas/; novo "Editar Publicação Avançado" (bloco<!-- dropdown-page-publisher -->, removido pormodelo_tag_delquando não há publicação) aponta para/publisher-pages/editar/?id=…&publisher_id=…. -
Painel "+": 5 tipos de embed (
object,iframe,embed,video,audio) nas duas listas de elementos (Live Editor e editor clássico); ao inserir, o motor envolve e abre o modal já na aba adequada.
Validação
-
php -l(dashboard.php,html-editor.php),node --check(html-editor.js,dashboard.toolbar.js,pdf-viewer.js,html-editor-visual-controls.js). -
Vitest: casos novos em
tests/Unit/JS/html-editor-embed.test.js(destino da inserção, isolamento da toolbar, idempotência do save, desembrulho nodisable, tipos novos do painel). -
PHPUnit sem regressão.