ValueConverter::fromPhp('#0b0e1a') gera SassString com aspas, e
'background-color:"#0b0e1a"' é CSS inválido (browser ignora — fundo
cinza). Bug latente desde os temas legados (afetava qualquer uso direto
de $var injetada, ex. cor do botão); ficou visível quando os fundos
passaram a usar $page-background-color. Hex agora entra via parseValue()
como cor de verdade — também habilita funções de cor sobre as variáveis.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cada tema agora expõe variáveis próprias no theme.json (color pickers
na config, injetadas no compile SCSS com !default):
- aurora-glass: page-background + aurora-color-1/2/3 (gradientes e blobs)
- nordic-minimal: page-background, panel-background e decor-color
(grid, anéis e sombra do painel)
- sunset-mesh: page-background, accent-color (links/foco) e
mesh-color-1..4 (os 4 lóbulos do mesh)
- carbon-neon: page-background, glow-color (bordas/glow/prompt/cursor)
e terminal-background-color
Tons translúcidos derivados de variável usam color-mix() do CSS (scssphp
não avalia rgba($var) de cor injetada; color-mix passa direto e o browser
resolve). Validado: injeção de variável altera o CSS compilado e os 4
temas servem color-mix na página de login.
Temas legados removidos (aurora-boreal, baloons, cloud, desktop, light,
neon, night, original, power-red, prompt-developer) — catálogo agora são
só os 4 modernos.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- nordic-minimal: split-screen padrão Stripe/Notion — painel branco
full-height ancorado à direita, anéis decorativos no lado livre,
form alinhado à esquerda dentro do painel.
- carbon-neon: janela de terminal ancorada à esquerda — title bar com
os 3 botões (no .card-header vazio do card), título user@glpi:~/login,
labels com prompt '>', cursor '_' piscando no h2, botão '$ ENTRAR'
outline que preenche no hover.
- sunset-mesh: borderless padrão Linear/Vercel — sem card, coluna
estreita direto no mesh, inputs underline, botão pill.
- aurora-glass: glass compacto centrado (26rem) abraçando o form,
inputs pill e dois blobs de aurora animados (keyframes) atrás.
Todos estilizam select2 do dropdown de origem de login e têm fallback
responsivo (painel/terminal centralizam em telas estreitas). Previews
regenerados refletindo o layout de cada tema.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
O body da tela de login do GLPI 11 é <body class="welcome-anonymous">;
.page-anonymous fica no <main>. Os seletores body.page-anonymous nunca
casavam e o cinza padrão do Tabler ficava por cima. Agora o fundo é
aplicado em body.welcome-anonymous, body.login-page e main.page-anonymous
(background-attachment: fixed alinha as camadas no viewport).
Gotcha de dev: o cache do compileScss é chaveado pelo texto do @import,
não pelo conteúdo do arquivo — editar login.scss exige ?reload=1 na URL
do login para recompilar.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Temas 100% CSS (sem fotos de fundo — gradientes, mesh e glassmorphism),
seguindo o contrato de variáveis existente (btn-background/foreground,
card-background) e estilizando o .card-body interno (o scss.class força
.main-content-card transparente quando não há cor de cartão definida).
- aurora-glass: glassmorphism escuro, aurora indigo/violeta/teal,
backdrop-filter blur no cartão
- nordic-minimal: claro escandinavo, grid sutil, acento azul profundo
- sunset-mesh: mesh gradient quente (coral/âmbar/violeta), cartão
translúcido estilo Stripe/Linear
- carbon-neon: dark tech, grid de carbono, glow ciano no cartão e botão
login.css fallback compilado com o próprio scssphp do core; previews
renderizados por script PHP GD (gradientes por pixel + mockup do cartão).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Aba em Configuração > Geral agora usa createTabEntry com ícone
ti ti-butterfly (Tabler v3.34 do core).
- Kill switch de licença nas duas camadas do padrão KB-PLUGIN-013:
check_config impede ativação sem licença Mindtek válida e
plugin_init aborta silenciosamente (mesmo padrão do plugin redmine).
- Gotcha operacional: mudar PLUGIN_BUTTERFLY_VERSION desativa o plugin
até rodar glpi:plugin:install de novo (checkPluginState).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Dropdown 'Logo' na seção Login Page: custom (imagem enviada ou logo do
tema — comportamento legado, default), original (força logo GLPI) e
hide (oculta via CSS injetado no display_login).
- Campos de CSS custom agora são textarea de 14 linhas sempre visível
(monospace, 100%); o Monaco só assume se window.GLPI.Monaco existir
(melhoria progressiva — antes o fallback dependia de JS e o campo
podia ficar escondido/curto).
- Traduções pt_BR novas + pt_BR.mo recompilado (msgfmt indisponível;
compilado com script Python puro).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
isPluginItemType() valida o itemtype com regex que não aceita '\' inicial;
registerClass('\GlpiPlugin\Butterfly\Config') retornava false silenciosamente
e a tab Butterfly nunca era registrada em Configuração > Geral. Usar ::class
(que nunca tem barra inicial) resolve e casa com o glpi_tab do config_page.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Classes migradas de inc/*.class.php (PluginButterfly*) para src/ com
namespace GlpiPlugin\Butterfly (PSR-4 registrado pelo core; KB-033).
Referências de core qualificadas (\Config, \Html, \Session, ...).
- Editor de CSS custom agora usa o Monaco do core (GLPI.Monaco.createEditor
+ sync via formdata, mesmo padrão de custom_ui do core) com fallback
para textarea se a lib não carregar.
- pics/ movido para public/pics: no GLPI 11 só recursos em public/ são
servidos estaticamente em /plugins/<key>/... (RequestRouterTrait).
URLs do select2 de temas agora usam root_doc + encodeURIComponent.
- MIN_GLPI_VERSION 11.0.0; removido bloco morto de GLPI <9.5 e
css/login.base.css órfão.
- config_page com glpi_tab urlencoded para a classe namespaced.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- $_GET['theme'] sanitizado no display_login com a mesma regex do
picture.send.php; getThemeInfo() ganhou defesa em profundidade
(rejeita qualquer valor que não seja nome simples de diretório).
- mkdir 0755 (era 0777) no storage de imagens.
- IMAGETYPE_BMP usava imagecreatefromwbmp (WBMP != BMP); agora
imagecreatefrombmp.
- public/themes/ removido: era cópia divergente e corrompida (CSS
mutilado por find/replace) da fonte real themes/ — o código só lê
themes/ da raiz e serve via picture.send.php.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- front/*.php não incluem mais ../../../inc/includes.php: no GLPI 11 o
LegacyFileLoadController boota o core antes do script, e o include
quebra quando o plugin roda do marketplace dir (KB-PLUGIN-028/010).
- logo.png (512x512) criado a partir de plugin.png: o LogoController só
reconhece o nome fixo logo.png (KB-INFRA-002).
- Removidos front/test_simple.php e front/login.css.php (deprecated),
incluindo a firewall strategy correspondente no setup.php (KB-018).
- json_encode com JSON_HEX_TAG|JSON_HEX_AMP em todo dado dinâmico
embutido em <script> (KB-PLUGIN-003).
- .gitignore padrão KB-018; .DS_Store removidos.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- add_css/add_javascript agora usam strings simples: o core do GLPI 11
interpola o valor uma única vez e acrescenta ?v=<versão> sozinho, o que
neutralizava o truque de __toString duplo do PluginButterflyFileVersion
(classe removida).
- CodeMirror foi removido do GLPI 11 (substituído por Monaco no core);
o init quebrava com ReferenceError. Textarea simples por ora; Monaco
entra na modernização.
- $('#tabs').tabs() removido: jQuery UI não existe mais no GLPI 11 e o
HTML das tabs já estava comentado.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Estado original vindo do servidor de origem via tar.gz, antes da
rodada de conformidade com a knowledge-base e fixes de GLPI 11.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>