-
Status do intake: implementation-in-progress
-
Data: 2026-08-14
-
Origem: solicitação direta durante a homologação da compilação Tailwind por recurso
-
Classificação preliminar: refatoração arquitetural incremental de Core e projetos privados
-
Batch candidato: BATCH-115
-
Dependência: req-114 fornece
css_precompiledetailwind_sources; este lote reduz e governa as fontes dinâmicas que ficaram fora dos recursos
Problema confirmado
O compilador Tailwind por recurso examina o HTML físico e as fontes adicionais declaradas em
tailwind_sources. Há, porém, HTML de interface construído diretamente em PHP e JavaScript. As
classes presentes somente nesses fragmentos podem ser eliminadas do sidecar do recurso.
O primeiro caso reproduzido foi dashboard-site-toolbar: o HTML físico contém o shell, mas o
elemento #c2f-toolbar-menu e seus itens são montados em dashboard.php. Utilities exclusivas
desse fragmento, como max-h-96, overflow-auto, text-[10px], italic e estados focus:*, não
existiam no css_precompiled original.
tailwind_sources resolve a cobertura de compilação, mas é uma ponte. A direção arquitetural é:
-
estrutura visual estável em componentes/templates de recursos;
-
dados e estado continuam sendo produzidos por PHP/JavaScript;
-
textos localizáveis saem do código e usam recursos por idioma/variáveis;
-
o código clona/preenche estruturas declaradas, em vez de concatenar HTML.
Inventário heurístico inicial
Os números abaixo contam arquivos ou linhas candidatas e precisam de revisão semântica; não significam que toda ocorrência deve virar um componente.
Core
-
32 arquivos JavaScript usam
innerHTML,insertAdjacentHTML,outerHTML,document.writeoucreateElement; -
36 arquivos PHP contêm literais HTML com classes;
-
maiores produtores JavaScript:
html-editor.js(123 tags candidatas),admin-arquivos.js(64),menus.js(45),galleries.js(25) ehtml-editor-visual-controls.js(21); -
módulos com recursos Tailwind e HTML dinâmico relevante:
-
dashboard: PHP e JavaScript do toolbar; -
formseforms-search; -
galleriesemenus; -
pages-index,publisher-indexepublisher-highlights; -
publisher.
-
Projeto REDACTED/REDACTED
-
[REDACTED]-system.js: 358 linhas candidatas e 14 recursos Tailwind relacionados; -
subscriptions.php: 40 linhas candidatas e 16 páginas Tailwind; -
busca-clinica.js: 14 linhas candidatas; -
subscriptions-plans.js: 14 linhas candidatas; -
utilities observadas no JavaScript e ausentes de todos os 14 sidecars do módulo
[REDACTED]-system:text-red-500emin-w-full.
Também há textos de interface diretamente no JavaScript, por exemplo estados vazios, mensagens de erro, upload, busca, documentos, categorias e histórico. A extração deve tratar estrutura e localização juntas para não apenas mover strings HTML entre arquivos.
Diagnóstico dos registros vazios no banco local
Na instalação [REDACTED]-local, a tabela paginas possui 53 registros Tailwind: 41 com
css_precompiled e 12 vazios. Os 12 vazios não correspondem a recursos físicos atuais descobertos
pelo builder:
-
home-alternativaeteste-de-pagina; -
contactsecontacts-successantigos sob o módulo removido/renomeadosignatures; -
signature,signature-checkoutewelcome-pro, em português e inglês.
As versões atuais de contacts e contacts-success, sob subscriptions, coexistem no banco e
possuem 7.333 e 4.501 bytes de pré-compilado. Portanto:
-
apagar
manager_updatesnão cria fonte física ausente; -
registros antigos são uma questão de reconciliação/órfãos, não de checksum;
-
páginas criadas apenas no editor podem legitimamente não ter
css_precompilede dependem decss_compiled; -
um recurso que deveria pertencer ao código precisa primeiro ser recuperado/criado na árvore de recursos para então ser compilado.
Classificação de destino
Componente
Usar para fragmento reutilizável ou shell visual estável: menu do toolbar, estados vazios, cards, feedback, badges, cabeçalhos, linhas de resultado, modais e controles repetidos.
Template
Usar para modelos escolhidos/instanciados pelo usuário, como menus, galerias, formulários, publicações e índices. O JavaScript deve manipular dados/atributos e clonar o template, não manter uma segunda cópia estrutural em string.
Página/layout
Manter o shell completo e slots explícitos para componentes dinâmicos. O layout continua dono de tema e Preflight; página/componente/template possuem suas utilities específicas.
Variável/localização
Usar para rótulos, mensagens, títulos, placeholders, estados vazios e erros consumidos fora de um HTML localizado. Texto fixo que pertence exclusivamente a um componente pode ficar no próprio recurso por idioma; textos reutilizados ou montados pelo código devem virar variáveis.
Exceção declarada
HTML altamente dependente de dados pode permanecer temporariamente no código quando extraí-lo criaria uma API artificial ou insegura. Toda exceção precisa:
-
declarar a fonte em
tailwind_sourcesno recurso consumidor; -
escapar dados variáveis;
-
usar identificador/justificativa auditável;
-
não conter texto localizável duplicado;
-
possuir teste de cobertura das utilities exclusivas.
Estratégia de implementação
Fase 0 — Cobertura imediata
-
manter
dashboard.phpemtailwind_sourcesdedashboard-site-toolbaraté a extração; -
mapear fontes dinâmicas por recurso e adicionar somente as necessárias para evitar regressão visual durante a refatoração;
-
testar utilities exclusivas, não apenas tamanho não zero do CSS.
Fase 1 — Contrato de fragmentos para JavaScript
-
definir um helper único para expor componentes localizados ao navegador, preferencialmente por elementos
<template data-c2f-component="...">já renderizados pelo servidor; -
JavaScript clona o template e preenche dados por
textContent, atributos e nós, evitando interpolação insegura; -
para respostas AJAX, retornar dados mais identificadores de template; HTML pronto só quando o endpoint usar oficialmente o renderizador de recursos.
Fase 2 — Migração por risco
-
dashboard-site-toolbar; -
[REDACTED]-systemebusca-clinica; -
subscriptionsesubscriptions-plans; -
módulos reutilizáveis
menus,galleries,forms*,pages-indexepublisher*; -
infraestrutura administrativa/editor (
html-editor.js,admin-arquivos.js), com contrato próprio para não misturar componentes de conteúdo com chrome interno do editor.
Cada migração deve remover a string antiga no mesmo lote; não manter HTML duplicado no recurso e no JavaScript/PHP.
Fase 3 — Textos e tradução
-
inventariar strings visíveis em PHP/JavaScript;
-
mover mensagens reutilizáveis para variáveis por módulo/idioma;
-
manter no componente apenas cópia estritamente pertencente ao fragmento localizado;
-
proibir novos fallbacks visíveis em português dentro de JavaScript compartilhado.
Fase 4 — Governança
-
auditoria automatizada para novos
innerHTML,insertAdjacentHTMLe literais<tag...>em PHP/JavaScript fora de allowlist; -
validação de que cada
tailwind_sourcesexiste e permanece dentro da raiz do gestor; -
relatório do gerador com quantidade de fontes adicionais por recurso;
-
teste que compile um recurso de prova e confirme classes presentes somente na fonte dinâmica;
-
relatório de banco distingue recurso atual, página exclusiva do editor e registro órfão.
Critérios de aceite
-
c2f-toolbar-menunão depende de HTML concatenado emdashboard.php; -
classes usadas em fragmentos dinâmicos aparecem no sidecar do recurso consumidor;
-
nenhum recurso Tailwind versionado pelo código chega ao
Data.jsoncom pré-compilado vazio; -
páginas exclusivamente autorais/editor são classificadas separadamente e continuam usando
css_compiled; -
Core e projeto não mantêm duas cópias do mesmo fragmento;
-
textos visíveis não ficam espalhados em JavaScript/PHP sem contrato de localização;
-
CI impede a reintrodução silenciosa de HTML dinâmico fora dos recursos/allowlist;
-
regressões cobrem português e inglês, Core e projeto.
Estado da implementação
-
inventário inicial e causa raiz confirmados;
-
c2f-toolbar-menuextraído integralmente dedashboard.phppara quatro componentes de recurso por idioma (menu,item,groupeempty); -
quatro textos da toolbar extraídos para variáveis localizadas em português e inglês;
-
a página
dashboard-site-toolbardeixou de usartailwind_sources; os utilitários exclusivos agora pertencem aos sidecars dos componentes; -
teste estrutural da toolbar verifica ausência do HTML/textos no PHP, presença dos oito recursos localizados e utilities críticas nos sidecars;
-
pontes temporárias por módulo adicionadas em
[REDACTED]-system,busca-clinicaesubscriptions, cobrindo seis componentes (pt-br/en) e as classes dinâmicas antes ausentes, incluindomin-w-full,text-red-500eanimate-spin; -
toda declaração
tailwind_sourcespassou a exigirtailwind_sources_reason; fontes inexistentes ou fora da raiz continuam causando erro fatal; -
o relatório incremental agora informa recursos e quantidade de fontes adicionais (Core: 0/0;
-
sidecar vazio deixou de ser cache válido e também é recusado no modo
--tailwind-import-only; -
tarefa
updates-manager-database.shganhou encaminhamento explícito de--force-alle filtro seguro--tables, eliminando a necessidade de apagar registros demanager_updates; -
geradores do Core e do projeto concluídos sem erro; teste focado aprovado com 11 testes e 56 asserções;
-
suíte completa aprovada com 264 testes e 1.041 asserções (quatro testes ignorados e uma depreciação já reportada pelo PHPUnit);
-
deploy privado local concluído via API com HTTP 200 após renovação automática do token: seis componentes de cobertura inseridos no banco;
-
banco local confirmado em leitura: os seis componentes privados possuem pré-compilado entre 4.109 e 14.019 bytes; a página da toolbar possui 6.303/6.331 bytes;
-
http://localhost/photon/respondeu HTTP 200 com dois blocos pré-compilados na página pública; -
sincronização direcionada da tabela
componentesconcluída após autorização explícita no ambiente de testes. A primeira execução confirmou que o deploy privado havia deixado o Data do projeto (39 componentes) no destino; o Core foi sincronizado novamente e a repetição processou 128 componentes, inserindo exatamente os oito novos, sem atualizações e sem órfãos; -
banco local confirmado com os quatro componentes da toolbar em português e inglês: sidecars de 4.063 bytes (
menu), 285 (empty), 914 (group) e 801 (item), todos comuser_modified=0; -
homologação visual inicial mostrou menu estruturalmente recuperado, porém rótulo do botão e placeholder vazios. Causa confirmada: a sincronização anterior havia sido limitada a
componentes, deixando de fora as oito novas variáveis localizadas; -
tabela
variaveissincronizada isoladamente após restauração do Data do Core: exatamente oito inserções, zero atualizações e zero órfãos. O banco passou a conterMódulos,Filtre os módulos...,Sem móduloseOutros, além das quatro versões em inglês; -
cobertura dos sidecars conferida diretamente:
group-hover:block,focus:outline-none,hover:bg-slate-100,text-[10px]eitalicestão presentes nos componentes responsáveis; -
comparação do DOM autenticado de produção e local confirmou que a estrutura dos dropdowns de Módulos, Página e Usuário permaneceu equivalente. Produção carregava o antigo
system-output.css; local possuía cinco sidecars de recurso, mas nenhumlayout-precompiled/@layer base; -
causa dos controles com aparência/comportamento irregular:
dashboard-site-toolbarera uma página Tailwind associada ao layout Fomanticlayout-pagina-simples. No contrato por recurso, páginas e componentes emitem utilities, enquanto o layout é responsável pelo Preflight; -
criado o layout global
layout-iframe-tailwindcssem português e inglês e a toolbar passou a utilizá-lo. Cada sidecar do layout possui 4.011 bytes e inclui@layer base,box-sizing:border-box,appearance:buttone o reset de bordas; -
sincronização local direcionada concluída para
layouts,paginas: dois layouts inseridos e as duas páginas localizadas da toolbar ligadas ao novo layout. O banco confirma Preflight e utilities preenchidos, semuser_modifiednesses registros; -
segunda captura local mostrou o layout ativo, mas revelou ordem incorreta dos estilos: quatro
resource-precompilederam emitidos antes delayout-precompiled. Como a primeira aparição de uma CSS Cascade Layer fixa sua posição,utilitiesficava registrada antes debase, permitindo ao Preflight posterior sobrescrever utilities de controles e afetar a geometria dos dropdowns; -
pipeline runtime corrigido para armazenar cada sidecar como bloco e ordenar estavelmente por papel antes de montar o
<head>:layout-precompiled,dependency-precompilede somente entãoresource-precompiled. Teste cobre inclusive o caso real em que componentes são carregados antes do layout; -
migração estrutural dos demais fragmentos de
[REDACTED]-system,subscriptionse módulos do Core continua incremental. As pontes garantem cobertura visual durante essa transição e não são consideradas estado arquitetural final.
Fechamento da rodada de homologação da Editbar
-
homologação do Chefe após
Ctrl+F5confirmou que a Editbar voltou a ficar visualmente muito próxima da versão de produção; a geometria e as cores principais dos dropdowns foram recuperadas; -
a diferença residual percebida como "zoom" não vem da meta viewport: as capturas local e de produção usam igualmente
width=device-width, initial-scale=1. O BATCH-083 altera apenas o preview Tablet/Mobile para viewport real em iframe. A diferença restante deve ser tratada como tipografia/cascata entre o pacote global legado e o Tailwind por recurso, semzoomartificial; -
gestor_componente()revisada: filtros deid, idioma e módulo são escapados; o ID numérico é convertido para inteiro; múltiplos IDs ficam agrupados para idioma e módulo valerem para todo o lote;return_css=falsedeixou de ser interpretado como ativo;development-envnão gera aviso quando ausente; e o sidecar entra explicitamente comoresource-precompiled; -
regressão da montagem em lote coberta por
GestorComponenteTest. Suíte completa aprovada com 268 testes e 1.060 asserções (quatro ignorados e uma depreciação preexistente do PHPUnit); -
sincronização final para
[REDACTED]-localconcluída: 173 recursos Tailwind encontrados, 173 em cache e zero erros;bibliotecas/gestor.phpfoi atualizada no destino de teste.
Migração dos bridges privados — rodada 2
-
busca-clinica-runtime-tailwindfoi substituído porbusca-clinica-runtime-fragmentsem português e inglês. O componente contém sete elementos<template>reais: ausência de sintomas, tag selecionada, loading, erro, vazio, ausência de sugestões e item de sugestão; -
busca-clinica.jspassou a clonar esses templates e preencher dados comtextContente atributos. A única atribuição deinnerHTMLrestante nessa área recebe o HTML de protocolos do renderizador oficial do servidor, exceção prevista no contrato da Fase 1; -
o componente de fragmentos da busca é anexado pelo PHP independentemente do HTML físico da página. Assim páginas com
user_modifiedtambém recebem os templates e o respectivocss_precompiledsem precisar ganhar um marcador novo; -
subscriptions-runtime-tailwindfoi substituído por três componentes de preço do checkout por idioma: plano gratuito, proposta sob medida e plano pago. O controlador agora escolhe o recurso da variação e aplica somente valores escapados; nenhuma classe Tailwind do card permanece no PHP; -
o relatório do gerador caiu de seis para dois recursos com fontes adicionais. Os dois restantes são exclusivamente
[REDACTED]-system-runtime-tailwind(pt-br/en); -
[REDACTED]-system.jsfoi inventariado e concentra busca, síntese, documentos, editor, categorias, cache e arquivos num único asset com dezenas de fragmentos. A ponte foi preservada até essas famílias serem extraídas por tela, pois removê-la agora reintroduziria a regressão visual; -
a diferença residual de escala foi identificada pelo operador como zoom de 110% no navegador. A experiência correta é 100% com o
font-sizepadrão de 16px; a tentativa local de 14px foi removida e todos os 66 recursos do projeto foram recompilados; -
testes estruturais do projeto aprovados: quatro casos cobrem os recursos pt-br/en, ausência das pontes antigas, sidecars preenchidos e propagação para
ComponentesData.json. -
deploy para
[REDACTED]-localconcluído com HTTP 200; a sincronização direcionada decomponentes --force-allconfirmou 43 registros sem divergência; -
leitura direta da base
photonconfirmou os oito recursos novos comuser_modified=0: fragmentos da busca com 5.036 bytes por idioma e cards do checkout entre 1.383 e 2.291 bytes; -
os quatro registros antigos dos bridges permanecem no banco como legado, porém nenhum controlador os carrega. A remoção física ficou fora desta rodada por ser destrutiva e não ter impacto no runtime.
Homologação da Busca Clínica e bundle canônico por página
-
a homologação de
busca-clinicarevelou uma limitação diferente de cobertura: sidecars individualmente corretos não podem ser simplesmente concatenados, porque os seletores Tailwind continuam globais. Um.hiddende recurso posterior venceu olg:flexdo layout, invertendo sidebar e navegação mobile no desktop; -
o resultado clínico tinha uma segunda causa:
busca_clinica_resolve_template()não selecionava nem encaminhavatemplates.css_precompiled. Por isso utilities existentes no template, comomax-h-56elg:grid-cols-3, não chegavam ao documento; -
o Core ganhou o papel
page-precompilede a opção explícita$_GESTOR['tailwind-page-bundle']. Quando ativa, somente o bundle canônico da página participa da faixa pré-compilada; CSS autoral ecss_compileddo editor continuam no pipeline; -
a página
busca-clinica-dashboarddeclara como fontes seu layout, o componente de fragmentos e os dois templates clínicos selecionáveis. O sidecar final tem 22.427 bytes e conserva a ordem canônica (hiddenantes delg:flex), além de contermax-h-56elg:grid-cols-3; -
a adoção é opt-in. Páginas ainda não convertidas continuam usando o contrato anterior de layout/dependências/recursos, evitando uma migração silenciosa e incompleta;
-
sincronização do core fonte e deploy privado local concluídos. Core, biblioteca, módulo e sidecar implantados foram confirmados por hash contra os fontes.
-
validação final desta fatia: suíte do Core com 269 testes e 1.064 asserções (quatro ignorados e uma depreciação preexistente), além de cinco testes Node do projeto aprovados.
Regressão encontrada após o primeiro deploy do bundle
-
o deploy não sobrescreveu os commits: ele ativou no banco o
page-precompilednovo. A homologação então revelou que o compilador tratava qualquer página como sidecar isolado, importando apenastailwindcss/utilities.css; -
como o runtime do bundle elimina o sidecar do layout, também desapareceram
@layer theme,@layer base, Preflight, fonte padrão e tokens do projeto. O CSS continha as classes corretas, mas sem o contrato global necessário para interpretá-las de forma consistente; -
tailwind_bundle: truepassou a ser metadado explícito de páginas. Nesse modo o compilador importa o input central completo; páginas comuns, componentes e templates continuam gerando somente utilities; -
a página
dashboard-site-toolbartambém foi convertida em bundle canônico com seu layout iframe e quatro componentes dinâmicos, evitando que a Editbar volte a depender da concatenação de cinco saídas Tailwind independentes.
Diretriz final do operador: produção não possui resources/
-
o operador esclareceu que
gestor/resourcesegestor/modulos/*/resourcessão apagados dos pacotes de teste/produção; todo recurso consumido em runtime deve vir das tabelas por helpers comogestor_componente(),gestor_layout()egestor_variaveis(); -
apesar de
tailwind_sourcesser lido apenas antes da compactação, caminhos físicos não devem ser o contrato de dependência entre recursos. O metadado deve referenciartype,module,languageeid; somente o compilador local traduz essa referência para um HTML físico; -
tailwind_sourcespermanece permitido apenas como escape hatch auditado para arquivos brutos ainda não extraídos (PHP/JavaScript). Dependências que já são recursos do Gestor devem usartailwind_dependencies.
Fechamento técnico do contrato semântico
-
Busca Clínica e Editbar foram convertidas para
tailwind_dependencies; nenhum dos dois bundles mantém caminho físico de componente/layout/template no metadado; -
o compilador infere o layout pelo ID já existente na página, aceita referência entre módulos e idioma explícito e resolve o arquivo somente na etapa local de build;
-
suíte completa do Core aprovada com 272 testes e 1.096 asserções; testes estruturais privados aprovados 3/3. A única pendência desta correção é homologação visual autenticada após
Ctrl+F5.