-
Status do intake: ready-for-intake
-
Data: 2026-08-17
-
Origem: solicitação do Engenheiro Chefe após diagnóstico de perda de estilos utilitários do Tailwind em páginas salvas, ausência de runtime CDN na Editbar e necessidade de botão/painel de Código no Live Editor
-
Classificação: bugfix e extensão de arquitetura de frontend (Editor HTML + Editbar)
-
Batch candidato: BATCH-117
1. Contexto e Diagnóstico
Cenário 1: Race Condition no Editor HTML Clássico (html-editor-interface.js)
No Editor HTML dos módulos administrativos (admin-paginas, etc.), a rotina updateCSSCompiled(iframe) dispara capture() aos 100ms.
-
O
@tailwindcss/browserinjeta imediatamente o<style>com@layer theme,@layer basee a declaração vazia@layer utilities;. -
A checagem
if (!tailwindStyle)avaliacssRules.length > 0como verdadeiro prematuramente (devido às regras base). -
O CSS é extraído antes de o mutation observer do Tailwind processar o
<body>e popular as classes reais (.text-3xl,.space-y-5, etc.), gravando um@layer utilities100% vazio emCodeMirrorCssCompilede no banco de dados.
Cenário 2: Ausência do Runtime Tailwind CDN no Editbar (dashboard.toolbar.js)
No modo de edição ao vivo na página pública (Site Toolbar / Editbar):
-
A página pública nasce renderizada apenas com o CSS estático pré-compilado (sem
@tailwindcss/browser). -
Ao clicar em "Editar Página",
dashboard.toolbar.jsinjeta jQuery, CodeMirror ehtml-editor.js, mas não injeta o runtime do@tailwindcss/browsernem o@theme static. -
Se o usuário adiciona novas classes utilitárias no Styler lateral ou no CodeMirror durante a edição:
-
Visualmente em tempo real: O elemento não reflete o novo estilo porque a classe inexiste no CSS estático da página.
-
No salvamento:
performSave()emdashboard.toolbar.jsextrai e envia apenas ohtml, sem compilar nem enviarcss_compiledao endpointsite-toolbar-save. O backend emdashboard.phpnunca atualiza a colunapaginas.css_compiled, e a página recarregada continua sem as novas classes.
-
Cenário 3: Ausência de Acesso ao Código-Fonte na Editbar (dashboard-site-toolbar.html)
-
No Editor HTML clássico (
html-editor-interface.js), a aba "Código" (data-tab="visualizacao-codigo") permite visualizar e editar o HTML (html), HTML Extra Head (html_extra_head), CSS autoral (css) e inspecionar o CSS Compilado (css_compiled). -
Na Editbar (
c2f-toolbar-editbar), o usuário atualmente não dispõe de um botão para abrir o código da página de forma estruturada. -
É necessário disponibilizar um novo botão "Código" na barra de ferramentas da Editbar, abrindo um painel flutuante equivalente com as 4 sub-abas e sincronização bidirecional em tempo real.
2. Escopo Técnico Requerido
Módulo 1: Blindagem de Polling e Validação de Utilitários em html-editor-interface.js
-
Implementar a verificação recursiva
hasGeneratedUtilities(rules)para inspecionar se o bloco@layer utilities(CSSLayerBlockRulecom nomeutilitiesecssRules.length > 0) possui regras filhas reais. -
Verificar se o documento possui classes a serem compiladas (
iframeDoc.body.querySelectorAll('[class]').length > 0). -
Condicionar o encerramento da captura à presença dos utilitários gerados quando houver classes no HTML (
utilitiesReady). -
Manter o loop de polling assíncrono (
setTimeout(() => capture(attempt + 1), 100)) com limite seguro (até 40 tentativas / 4 segundos).
Módulo 2: Injeção do Tailwind Browser e Extração de css_compiled no Live Editor (dashboard.toolbar.js)
-
Ativação da Edição (
activateEditor/startEdit):-
Ao iniciar a edição in-place em páginas com Tailwind (
framework === 'tailwindcss'), injetar na página hospedeira:-
A tag
<style type="text/tailwindcss" data-c2f-tailwind-role="browser-contract">com o@theme static(mesmo contrato do build offline). -
O script do CDN:
<script src="[REDACTED]></script>.
-
-
Isso permite que qualquer classe nova adicionada pelo usuário via Styler, painel de inserção ou CodeMirror seja renderizada instantaneamente na tela.
-
-
Salvamento (
performSave):-
Capturar o CSS compilado gerado pelo runtime do Tailwind na página hospedeira (usando a mesma lógica robusta de
filterRulesehasGeneratedUtilities). -
Anexar
css_compiledao corpo do POST enviado paradashboardAjaxUrl() + '?ajax=1&ajaxOpcao=site-toolbar-save'. -
O backend em
dashboard.php(dashboard_ajax_site_toolbar_save) já aceitacss_compiledno array$campose persistirá o valor atualizado empaginas.css_compiled.
-
Módulo 3: Botão e Painel de "Código" na Editbar (dashboard-site-toolbar.html, dashboard.iframe-toolbar.js, dashboard.toolbar.js)
-
Botão na Editbar (
dashboard-site-toolbar.htmlpt-br / en):-
Inserir o botão
<button type="button" id="c2f-code-btn" title="Código da página">ao lado do botão Assistente IA (#c2f-ai-btn). -
Ícone representativo de código (
</>) com rótulo "Código" (PT-BR) / "Code" (EN).
-
-
Ponte de Comunicação (
dashboard.iframe-toolbar.js):-
Listener de clique no
#c2f-code-btndisparandowindow.parent.postMessage({ type: 'c2f-toolbar:edit-code', x: r.left, y: r.bottom }, origin).
-
-
Painel Flutuante de Código (
c2f-code-panelemdashboard.toolbar.js):-
Montar o painel na página hospedeira (mesmo padrão do
#c2f-page-config-panele#c2f-ai-panel). -
Blindagem e Isolamento: Registrado no
isEditorOwned()dehtml-editor.js, com barreiras de evento de clique para não vazar seleção para a página atrás, e fechamento integrado emdismissHostPanels(). -
4 Sub-abas com CodeMirror (tema
'tomorrow-night-bright', indentUnit 4, refresh dinâmico ao alternar abas):-
Aba HTML: Exibe o HTML limpo do corpo (
html), sincronizado com o DOM vivo doc2fEditor. -
Aba HTML Extra Head: Exibe/edita o cabeçalho extra (
html_extra_head). -
Aba CSS: Exibe/edita o CSS autoral da página (
css). -
Aba CSS Compilado: Exibe o CSS utilitário gerado em tempo real pelo
@tailwindcss/browser(css_compiled).
-
-
-
Sincronização Bidirecional:
-
Ao abrir o painel, o CodeMirror carrega o estado exato e atual do DOM em edição.
-
Alterações no CodeMirror de HTML/CSS aplicam ao vivo no DOM da página hospedeira e re-disparam a compilação do Tailwind Browser.
-
No salvamento (
performSave), as alterações dehtml,css,html_extra_headecss_compiledsão unificadas no payload dosite-toolbar-save.
-
Módulo 4: Testes Automatizados e Paridade de Ambientes (Vitest)
-
Cobrir a detecção de regras em
@layer utilitiescom objetos CSSOM simulados. -
Testar o fluxo de extração em
html-editor-interface.jse emdashboard.toolbar.js. -
Testar a abertura, sincronização e persistência do painel de Código da Editbar.
-
Garantir que
node --checke a suíte completa de testes passem com 100% de sucesso.
3. Critérios de Aceite e Validação
-
Edição Clássica (Admin-Páginas): Ao salvar no Editor HTML, o campo
CodeMirrorCssCompiledrecebe todas as classes utilitárias da página dentro de@layer utilities { ... }. -
Edição ao Vivo (Editbar): Ao editar diretamente na página pública, novas classes digitadas ou selecionadas no Styler têm efeito visual imediato na tela.
-
Persistência Completa na Editbar: Salvar via Editbar atualiza
html,css,html_extra_headecss_compiledno banco de dados (paginas), garantindo fidelidade visual pública após o recarregamento. -
Painel de Código na Editbar: Clicar no botão "Código" abre o painel flutuante com as 4 abas e editores CodeMirror funcionais, sem vazamento de clique para o elemento de trás.
-
Sincronia de Código: Alterações no CodeMirror do painel de código atualizam o DOM da página hospedeira e vice-versa.
-
Sem Race Conditions: Nenhuma extração encerra prematuramente com
@layer utilities;vazio quando há classes utilitárias no HTML. -
Testes Unitários: Testes do Vitest (
npx vitest run) enode --check100% verdes sem regressão.